diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp index ce58efddbb9737531afe6fca1f8c9275540e702e..d8bc59397eb9572c15240a5da198c10a3e2aec92 100644 --- a/src/audio/pulselayer.cpp +++ b/src/audio/pulselayer.cpp @@ -21,7 +21,14 @@ int framesPerBuffer = 2048; - PulseLayer::PulseLayer(ManagerImpl* manager) +static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ) +{ + assert( s && bytes ); + assert( bytes > 0 ); + static_cast<PulseLayer*>(userdata)->processData(); +} + + PulseLayer::PulseLayer(ManagerImpl* manager) : AudioLayer( manager , PULSEAUDIO ) , _mainSndRingBuffer( SIZEBUF ) , _urgentRingBuffer( SIZEBUF) @@ -125,7 +132,7 @@ PulseLayer::createStreams( pa_context* c ) record = new AudioStream(c, CAPTURE_STREAM, CAPTURE_STREAM_NAME , _manager->getMicVolume()); pa_stream_set_read_callback( record->pulseStream() , audioCallback, this); //pa_stream_set_underflow_callback( record->pulseStream() , underflow , this); - cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples", _manager->getSpkrVolume()); + //cache = new AudioStream(c, UPLOAD_STREAM, "Cache samples", _manager->getSpkrVolume()); pa_threaded_mainloop_signal(m , 0); } @@ -240,14 +247,7 @@ PulseLayer::stopStream (void) flushMic(); } - void -PulseLayer::audioCallback ( pa_stream* s, size_t bytes, void* userdata ) -{ - PulseLayer* pulse = (PulseLayer*) userdata; - assert( s && bytes ); - assert( bytes > 0 ); - pulse->processData(); -} + void PulseLayer::underflow ( pa_stream* s UNUSED, void* userdata UNUSED ) @@ -292,8 +292,9 @@ void PulseLayer::writeToSpeaker( void ) int toGet; int toPlay; - SFLDataFormat* out; + SFLDataFormat* out;// = (SFLDataFormat*)pa_xmalloc(framesPerBuffer); urgentAvail = _urgentRingBuffer.AvailForGet(); + if (urgentAvail > 0) { // Urgent data (dtmf, incoming call signal) come first. //_debug("Play urgent!: %i\n" , urgentAvail); @@ -331,11 +332,11 @@ void PulseLayer::writeToSpeaker( void ) else { bzero(out, framesPerBuffer * sizeof(SFLDataFormat)); } - pa_stream_write( playback->pulseStream() , out , toGet , pa_xfree, 0 , PA_SEEK_RELATIVE); + pa_stream_write( playback->pulseStream() , out , toGet , NULL, 0 , PA_SEEK_RELATIVE); + pa_xfree(out); } } - //if(out) pa_xfree(out); } void PulseLayer::readFromMic( void ) diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h index 5dcd31a5f91cb71499b8a475a47e3de808a4e3fa..2a055c81c67290309dfa96d87ef491d20bbecb67 100644 --- a/src/audio/pulselayer.h +++ b/src/audio/pulselayer.h @@ -103,7 +103,7 @@ class PulseLayer : public AudioLayer { */ int playSamples(void* buffer, int toCopy, bool isTalking) ; - static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ); + //static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ); static void overflow ( pa_stream* s, void* userdata ); static void underflow ( pa_stream* s, void* userdata ); static void stream_state_callback( pa_stream* s, void* user_data ); @@ -172,6 +172,7 @@ class PulseLayer : public AudioLayer { int getMicVolume( void ) { return micVolume; } void setMicVolume( int value ) { micVolume = value; } + void processData( void ); private: // Copy Constructor PulseLayer(const PulseLayer& rh); @@ -188,7 +189,6 @@ class PulseLayer : public AudioLayer { /** * Write data from the ring buffer to the harware and read data from the hardware */ - void processData( void ); void readFromMic( void ); void writeToSpeaker( void );