diff --git a/src/audio/audiolayer.cpp b/src/audio/audiolayer.cpp index a69118145b4d32a2842c5d2cea3c84c3318da51e..785c47e71f5247dc9aa5559cf7c28db92359b834 100644 --- a/src/audio/audiolayer.cpp +++ b/src/audio/audiolayer.cpp @@ -147,7 +147,7 @@ AudioLayer::fillHWBuffer( void) unsigned char* data; int pcmreturn, l1, l2; short s1, s2; - int periodSize = 128 ; + int periodSize = 256 ; int frames = periodSize >> 2 ; data = (unsigned char*)malloc(periodSize); @@ -257,23 +257,6 @@ AudioLayer::playUrgent( void ) int toGet; if(_talk) {}//_debug("Stop Callback\n"); else { - /*int avail = _urgentBuffer.AvailForGet(); - _debug("callback %d\n" , avail ); - if( avail > 0 ){ - toGet = ( avail < maxBytes)? avail : maxBytes ; - _urgentBuffer.Get( out , toGet , 100 ); - write( out , toGet ); - } - else{ - //loop( out , maxBytes ); - AudioLoop *tone = _manager -> getTelephoneTone(); - if( tone != 0 ){ - tone -> getNext( out , maxBytes , 10 ); - write( out , maxBytes ); - } - } - */ - AudioLoop *tone = _manager -> getTelephoneTone(); int spkrVol = _manager -> getSpkrVolume(); SFLDataFormat out[maxBytes]; @@ -311,7 +294,6 @@ AudioLayer::isCaptureActive(void) { AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) { int err; - snd_pcm_hw_params_t *hwparams = NULL; unsigned int rate_in = getSampleRate(); unsigned int rate_out = getSampleRate(); int dir = 0; @@ -331,19 +313,18 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) return false; } - if( err = snd_pcm_hw_params_malloc( &hwparams ) < 0 ) { + if( err = snd_pcm_hw_params_malloc( &_CaptureHwParams ) < 0 ) { _debugAlsa(" Cannot allocate hardware parameter structure (%s)\n", snd_strerror(err)); return false; } - if( err = snd_pcm_hw_params_any(_CaptureHandle, hwparams) < 0) _debugAlsa(" Cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_access( _CaptureHandle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) _debugAlsa(" Cannot set access type (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_format( _CaptureHandle, hwparams, SND_PCM_FORMAT_S16_LE) < 0) _debugAlsa(" Cannot set sample format (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_rate_near( _CaptureHandle, hwparams, &rate_in, &dir) < 0) _debugAlsa(" Cannot set sample rate (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_channels( _CaptureHandle, hwparams, 1) < 0) _debugAlsa(" Cannot set channel count (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_period_size_near( _CaptureHandle, hwparams, &period_size_in , &dir) < 0) _debugAlsa(" Cannot set period size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_buffer_size_near( _CaptureHandle, hwparams, &buffer_size_in ) < 0) _debugAlsa(" Cannot set buffer size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params( _CaptureHandle, hwparams ) < 0) _debugAlsa(" Cannot set hw parameters (%s)\n", snd_strerror(err)); - snd_pcm_hw_params_free( hwparams ); + if( err = snd_pcm_hw_params_any(_CaptureHandle, _CaptureHwParams) < 0) _debugAlsa(" Cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_access( _CaptureHandle, _CaptureHwParams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) _debugAlsa(" Cannot set access type (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_format( _CaptureHandle, _CaptureHwParams, SND_PCM_FORMAT_S16_LE) < 0) _debugAlsa(" Cannot set sample format (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_rate_near( _CaptureHandle, _CaptureHwParams, &rate_in, &dir) < 0) _debugAlsa(" Cannot set sample rate (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_channels( _CaptureHandle, _CaptureHwParams, 1) < 0) _debugAlsa(" Cannot set channel count (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_period_size_near( _CaptureHandle, _CaptureHwParams, &period_size_in , &dir) < 0) _debugAlsa(" Cannot set period size (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_buffer_size_near( _CaptureHandle, _CaptureHwParams, &buffer_size_in ) < 0) _debugAlsa(" Cannot set buffer size (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params( _CaptureHandle, _CaptureHwParams ) < 0) _debugAlsa(" Cannot set hw parameters (%s)\n", snd_strerror(err)); deviceClosed = false; } @@ -356,19 +337,18 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) _debugAlsa(" Error while opening playback device %s (%s)\n", pcm_p.c_str(), snd_strerror(err)); return false; } - if( err = snd_pcm_hw_params_malloc( &hwparams ) < 0 ) { + if( err = snd_pcm_hw_params_malloc( &_PlaybackHwParams ) < 0 ) { _debugAlsa(" Cannot allocate hardware parameter structure (%s)\n", snd_strerror(err)); return false; } - if( err = snd_pcm_hw_params_any( _PlaybackHandle, hwparams) < 0) _debugAlsa(" Cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_access( _PlaybackHandle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) _debugAlsa(" Cannot set access type (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_format( _PlaybackHandle, hwparams, SND_PCM_FORMAT_S16_LE) < 0) _debugAlsa(" Cannot set sample format (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_rate_near( _PlaybackHandle, hwparams, &rate_out, &dir) < 0) _debugAlsa(" Cannot set sample rate (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_channels( _PlaybackHandle, hwparams, 1) < 0) _debugAlsa(" Cannot set channel count (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_period_size_near( _PlaybackHandle, hwparams, &period_size_out , &dir) < 0) _debugAlsa(" Cannot set period size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_buffer_size_near( _PlaybackHandle, hwparams, &buffer_size_out ) < 0) _debugAlsa(" Cannot set buffer size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params( _PlaybackHandle, hwparams ) < 0) _debugAlsa(" Cannot set hw parameters (%s)\n", snd_strerror(err)); - snd_pcm_hw_params_free( hwparams ); + if( err = snd_pcm_hw_params_any( _PlaybackHandle, _PlaybackHwParams) < 0) _debugAlsa(" Cannot initialize hardware parameter structure (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_access( _PlaybackHandle, _PlaybackHwParams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) _debugAlsa(" Cannot set access type (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_format( _PlaybackHandle, _PlaybackHwParams, SND_PCM_FORMAT_S16_LE) < 0) _debugAlsa(" Cannot set sample format (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_rate_near( _PlaybackHandle, _PlaybackHwParams, &rate_out, &dir) < 0) _debugAlsa(" Cannot set sample rate (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_channels( _PlaybackHandle, _PlaybackHwParams, 1) < 0) _debugAlsa(" Cannot set channel count (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_period_size_near( _PlaybackHandle, _PlaybackHwParams, &period_size_out , &dir) < 0) _debugAlsa(" Cannot set period size (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_buffer_size_near( _PlaybackHandle, _PlaybackHwParams, &buffer_size_out ) < 0) _debugAlsa(" Cannot set buffer size (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params( _PlaybackHandle, _PlaybackHwParams ) < 0) _debugAlsa(" Cannot set hw parameters (%s)\n", snd_strerror(err)); snd_pcm_uframes_t val = 1024 ; snd_pcm_sw_params_malloc( &swparams ); @@ -397,11 +377,10 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) AudioLayer::write(void* buffer, int length) { - int bytes; snd_pcm_uframes_t frames = snd_pcm_bytes_to_frames( _PlaybackHandle, length); - //snd_pcm_sframes_t delay; - //snd_pcm_delay( _PlaybackHandle , &delay ) ; + snd_pcm_sframes_t delay; + snd_pcm_delay( _PlaybackHandle , &delay ) ; //_debug("Write %d frames\n" , frames); if(snd_pcm_state( _PlaybackHandle ) == SND_PCM_STATE_XRUN) @@ -420,7 +399,7 @@ AudioLayer::write(void* buffer, int length) } else if(bytes >=0 && bytes < frames) { - _debugAlsa("Short write - Frames remaining = %d\n", frames); + //_debugAlsa("Short write - Frames remaining = %d\n", frames - bytes); } else if( bytes == -EPIPE ) { @@ -600,6 +579,7 @@ AudioLayer::closeCaptureStream( void) snd_pcm_drop( _CaptureHandle ); snd_pcm_close( _CaptureHandle ); _CaptureHandle = 0; + snd_pcm_hw_params_free( _CaptureHwParams ); } } @@ -611,6 +591,7 @@ AudioLayer::closePlaybackStream( void) snd_pcm_drop( _PlaybackHandle ); snd_pcm_close( _PlaybackHandle ); _PlaybackHandle = 0; + snd_pcm_hw_params_free( _PlaybackHwParams ); } } diff --git a/src/audio/audiolayer.h b/src/audio/audiolayer.h index 099505d59759bc2b6cd2d7b3139bfda353c2dadb..2a279419e1372c134ab7d96732ff42c27726a1b0 100644 --- a/src/audio/audiolayer.h +++ b/src/audio/audiolayer.h @@ -283,12 +283,19 @@ class AudioLayer { ManagerImpl* _manager; // augment coupling, reduce indirect access /* - * Handle to manipulate capture and playback streams + * Handles to manipulate capture and playback streams * ALSA Library API */ snd_pcm_t* _PlaybackHandle; snd_pcm_t* _CaptureHandle; + /* + * Handles to manipulate capture and playback hardware configuration + * ALSA Library API + */ + snd_pcm_hw_params_t *_PlaybackHwParams; + snd_pcm_hw_params_t *_CaptureHwParams; + /* * Handle on asynchronous event */