diff --git a/src/audio/audiolayer.cpp b/src/audio/audiolayer.cpp index d799939335b1e22cda5456a85532f8bd12885c79..0b0c54edb2f28e3459b7f965e5fea37fcf35dbe4 100644 --- a/src/audio/audiolayer.cpp +++ b/src/audio/audiolayer.cpp @@ -152,7 +152,7 @@ AudioLayer::fillHWBuffer( void) data[4*l2+2] = (unsigned char)s2; data[4*l2+3] = s2 >> 8; } - while ((pcmreturn = snd_pcm_mmap_writei(_PlaybackHandle, data, frames)) < 0) { + while ((pcmreturn = snd_pcm_writei(_PlaybackHandle, data, frames)) < 0) { snd_pcm_prepare(_PlaybackHandle); //_debugAlsa("< Buffer Underrun >\n"); } @@ -295,8 +295,8 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) unsigned int rate_in = getSampleRate(); unsigned int rate_out = getSampleRate(); int dir = 0; - snd_pcm_uframes_t period_size_in = getFrameSize() * getSampleRate() / 1000 * 2 ; - snd_pcm_uframes_t buffer_size_in = period_size_in * 4 ; + snd_pcm_uframes_t period_size = 2048; + snd_pcm_uframes_t buffer_size = period_size * 4 ; snd_pcm_uframes_t threshold = 1024 ; snd_pcm_uframes_t period_size_out = getFrameSize() * getSampleRate() / 1000 * 2;//1024 ; snd_pcm_uframes_t buffer_size_out = period_size_out * 4 ; @@ -324,11 +324,7 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) 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_time_near( _CaptureHandle, hwParams, &period_time , &dir) < 0) _debugAlsa(" Cannot set period time (%s)\n", snd_strerror(err)); if( err = snd_pcm_hw_params_set_buffer_time_near( _CaptureHandle, hwParams, &buffer_time , &dir) < 0) _debugAlsa(" Cannot set buffer time (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_get_period_size( hwParams, &period_size_in , &dir) < 0) _debugAlsa(" Cannot get period size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_get_buffer_size( hwParams, &buffer_size_in ) < 0) _debugAlsa(" Cannot get 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)); - _debug("buffer size = %d\n" , period_size_in); - _debug("period size = %d\n" , buffer_size_in); snd_pcm_hw_params_free( hwParams ); snd_pcm_uframes_t val ; @@ -350,8 +346,8 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) { _debugAlsa(" Opening playback device %s\n", pcm_p.c_str()); - if(err = snd_pcm_open(&_PlaybackHandle, pcm_p.c_str(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ) < 0){ - _debugAlsa("Error while opening playback device %s\n", pcm_c.c_str()); + if(err = snd_pcm_open(&_PlaybackHandle, pcm_p.c_str(), SND_PCM_STREAM_PLAYBACK, 0 ) < 0){ + _debugAlsa("Error while opening playback device %s\n", pcm_p.c_str()); setErrorMessage( ALSA_PLAYBACK_DEVICE ); return false; } @@ -360,15 +356,14 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) 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_MMAP_INTERLEAVED) < 0) _debugAlsa(" Cannot set access type (%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_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( _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_buffer_time_near( _PlaybackHandle, hwParams, &buffer_time , &dir) < 0) _debugAlsa(" Cannot set buffer time (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_set_period_time_near( _PlaybackHandle, hwParams, &period_time , &dir) < 0) _debugAlsa(" Cannot set period time (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_get_period_size( hwParams, &_periodSize , &dir) < 0) _debugAlsa(" Cannot get period size (%s)\n", snd_strerror(err)); - if( err = snd_pcm_hw_params_get_buffer_size( hwParams, &buffer_size_out ) < 0) _debugAlsa(" Cannot get buffer size (%s)\n", snd_strerror(err)); + + if( err = snd_pcm_hw_params_set_buffer_size( _PlaybackHandle, hwParams, buffer_size ) < 0) _debugAlsa(" Cannot set buffer size (%s)\n", snd_strerror(err)); + if( err = snd_pcm_hw_params_set_period_size_near( _PlaybackHandle, hwParams, &period_size , &dir) < 0) _debugAlsa(" Cannot set period 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)); @@ -394,7 +389,7 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) if( err = snd_pcm_sw_params( _PlaybackHandle, swparams ) < 0 ) _debugAlsa(" Cannot set sw parameters (%s)\n", snd_strerror(err)); snd_pcm_sw_params_free( swparams ); - if ( err = snd_async_add_pcm_handler( &_AsyncHandler, _PlaybackHandle , AlsaCallBack, this ) < 0) _debugAlsa(" Unable to install the async callback handler (%s)\n", snd_strerror(err)); + //if ( err = snd_async_add_pcm_handler( &_AsyncHandler, _PlaybackHandle , AlsaCallBack, this ) < 0) _debugAlsa(" Unable to install the async callback handler (%s)\n", snd_strerror(err)); deviceClosed = false; } //fillHWBuffer(); @@ -407,28 +402,26 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) int AudioLayer::write(void* buffer, int length) { - //if(snd_pcm_state( _PlaybackHandle ) == SND_PCM_STATE_XRUN) - //handle_xrun_playback(); - //_debugAlsa("avail = %d - toWrite = %d\n" , snd_pcm_avail_update( _PlaybackHandle ) , length / 2); - snd_pcm_uframes_t frames = snd_pcm_bytes_to_frames( _PlaybackHandle, length); - int err = snd_pcm_mmap_writei( _PlaybackHandle , buffer , frames ); + //int err = snd_pcm_mmap_writei( _PlaybackHandle , buffer , frames ); + int err = snd_pcm_writei( _PlaybackHandle , buffer , frames ); switch(err) { case -EAGAIN: - _debugAlsa(" (%s)\n", snd_strerror( err )); - snd_pcm_resume( _PlaybackHandle ); + _debugAlsa("EAGAIN (%s)\n", snd_strerror( err )); + //snd_pcm_resume( _PlaybackHandle ); break; case -EPIPE: _debugAlsa(" UNDERRUN (%s)\n", snd_strerror(err)); handle_xrun_playback(); - snd_pcm_mmap_writei( _PlaybackHandle , buffer , frames ); + //snd_pcm_mmap_writei( _PlaybackHandle , buffer , frames ); + //snd_pcm_writei( _PlaybackHandle , buffer , frames ); break; case -ESTRPIPE: - _debugAlsa(" (%s)\n", snd_strerror(err)); - snd_pcm_resume( _PlaybackHandle ); + _debugAlsa("ESTRPIPE (%s)\n", snd_strerror(err)); + //snd_pcm_resume( _PlaybackHandle ); break; case -EBADFD: - _debugAlsa(" (%s)\n", snd_strerror( err )); + _debugAlsa("EBADFD (%s)\n", snd_strerror( err )); break; } @@ -510,7 +503,8 @@ AudioLayer::handle_xrun_playback( void ) state = snd_pcm_status_get_state( status ); if( state == SND_PCM_STATE_XRUN ) { - snd_pcm_drop( _PlaybackHandle ); + //snd_pcm_drop( _PlaybackHandle ); + _debug("Underrun\n"); snd_pcm_prepare( _PlaybackHandle ); //snd_pcm_start( _PlaybackHandle ); } diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 26f4dc9852f31a4ff0dc6182f680a3c7ba3aea26..349413911f64ea168a9608cdff78607e850d14af 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -732,7 +732,7 @@ ManagerImpl::stopTone(bool stopAudio=true) { if (stopAudio) { AudioLayer* audiolayer = getAudioDriver(); - if (audiolayer) { audiolayer->stopStream(); } + //if (audiolayer) { audiolayer->stopStream(); } } _toneMutex.enterMutex();