Mercurial > hg > svapp
diff audioio/AudioPortAudioTarget.cpp @ 100:22bf057ea151 1.2-stable
* merge from trunk (1.2 ended up being tracked from trunk, but we may want
this branch for fixes later)
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 10:32:45 +0000 |
parents | a8acc7841d70 |
children |
line wrap: on
line diff
--- a/audioio/AudioPortAudioTarget.cpp Fri Nov 30 17:36:14 2007 +0000 +++ b/audioio/AudioPortAudioTarget.cpp Wed Feb 27 10:32:45 2008 +0000 @@ -48,7 +48,7 @@ return; } - m_bufferSize = 1024; + m_bufferSize = 2048; m_sampleRate = 44100; if (m_source && (m_source->getSourceSampleRate() != 0)) { m_sampleRate = m_source->getSourceSampleRate(); @@ -63,11 +63,29 @@ m_sampleRate, m_bufferSize, 0, processStatic, this); #else - err = Pa_OpenDefaultStream(&m_stream, 0, 2, paFloat32, - m_sampleRate, m_bufferSize, - processStatic, this); + PaStreamParameters op; + op.device = Pa_GetDefaultOutputDevice(); + op.channelCount = 2; + op.sampleFormat = paFloat32; + op.suggestedLatency = 0.2; + op.hostApiSpecificStreamInfo = 0; + err = Pa_OpenStream(&m_stream, 0, &op, m_sampleRate, + paFramesPerBufferUnspecified, + paNoFlag, processStatic, this); #endif +#ifndef HAVE_PORTAUDIO_V18 + if (err != paNoError) { + + std::cerr << "WARNING: AudioPortAudioTarget: Failed to open PortAudio stream with default frames per buffer, trying again with fixed frames per buffer..." << std::endl; + + err = Pa_OpenStream(&m_stream, 0, &op, m_sampleRate, + 1024, + paNoFlag, processStatic, this); + m_bufferSize = 1024; + } +#endif + if (err != paNoError) { std::cerr << "ERROR: AudioPortAudioTarget: Failed to open PortAudio stream: " << Pa_GetErrorText(err) << std::endl; m_stream = 0; @@ -78,6 +96,7 @@ #ifndef HAVE_PORTAUDIO_V18 const PaStreamInfo *info = Pa_GetStreamInfo(m_stream); m_latency = int(info->outputLatency * m_sampleRate + 0.001); + if (m_bufferSize < m_latency) m_bufferSize = m_latency; #endif std::cerr << "PortAudio latency = " << m_latency << " frames" << std::endl; @@ -94,7 +113,7 @@ if (m_source) { std::cerr << "AudioPortAudioTarget: block size " << m_bufferSize << std::endl; - m_source->setTargetBlockSize(m_bufferSize); + m_source->setTarget(this, m_bufferSize); m_source->setTargetSampleRate(m_sampleRate); m_source->setTargetPlayLatency(m_latency); } @@ -108,6 +127,10 @@ { std::cerr << "AudioPortAudioTarget::~AudioPortAudioTarget()" << std::endl; + if (m_source) { + m_source->setTarget(0, m_bufferSize); + } + shutdown(); if (m_stream) { @@ -145,6 +168,13 @@ return (m_stream != 0); } +double +AudioPortAudioTarget::getCurrentTime() const +{ + if (!m_stream) return 0.0; + else return Pa_GetStreamTime(m_stream); +} + #ifdef HAVE_PORTAUDIO_V18 int AudioPortAudioTarget::processStatic(void *input, void *output,