void Alsa9Buf::SetChunksize( snd_pcm_sframes_t frames ) { preferred_chunksize = frames; SetHWParams(); SetSWParams(); }
void Alsa9Buf::SetSampleRate(int hz) { samplerate = hz; samplerate_set_explicitly = true; if( !SetHWParams() ) { /* * If this fails, we're no longer set up; if we call SW param calls, * ALSA will assert out on us (instead of gracefully returning an error). * * If we fail here, it means we set up the initial stream, but can't * configure it to the sample rate we want. This happened on a CS46xx * with an old ALSA version, at least: snd_pcm_hw_params failed * with ENOMEM. It set up only 10 44.1khz streams; it may have been * trying to increase one to 48khz and, for some reason, that needed * more card memory. (I've tried to work around that by setting up * streams as 48khz to begin with, so we set it up as the maximum * to begin with.) */ FAIL_M( ssprintf("SetHWParams(%i) failed", hz) ); } SetSWParams(); }
Alsa9Buf::Alsa9Buf( hw hardware, int channels_ ) { GetSoundCardDebugInfo(); InitializeErrorHandler(); channels = channels_; samplerate = 44100; samplebits = 16; last_cursor_pos = 0; samplerate_set_explicitly = false; preferred_writeahead = 8192; preferred_chunksize = 1024; /* Open the device. */ int err; err = dsnd_pcm_open( &pcm, DeviceName(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ); if (err < 0) RageException::ThrowNonfatal("dsnd_pcm_open(%s): %s", DeviceName().c_str(), dsnd_strerror(err)); if( !SetHWParams() ) { CHECKPOINT; dsnd_pcm_close(pcm); CHECKPOINT; RageException::ThrowNonfatal( "SetHWParams failed" ); } SetSWParams(); }
RString Alsa9Buf::Init( int channels_, int iWriteahead, int iChunkSize, int iSampleRate ) { channels = channels_; preferred_writeahead = iWriteahead; preferred_chunksize = iChunkSize; if( iSampleRate == 0 ) samplerate = 44100; else samplerate = iSampleRate; GetSoundCardDebugInfo(); InitializeErrorHandler(); /* Open the device. */ int err; err = dsnd_pcm_open( &pcm, DeviceName(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ); if( err < 0 ) return ssprintf( "dsnd_pcm_open(%s): %s", DeviceName().c_str(), dsnd_strerror(err) ); if( !SetHWParams() ) { CHECKPOINT; return "SetHWParams failed"; } SetSWParams(); LOG->Info( "ALSA: Mixing at %ihz", samplerate ); if( preferred_writeahead != writeahead ) LOG->Info( "ALSA: writeahead adjusted from %u to %u", (unsigned) preferred_writeahead, (unsigned) writeahead ); if( preferred_chunksize != chunksize ) LOG->Info( "ALSA: chunksize adjusted from %u to %u", (unsigned) preferred_chunksize, (unsigned) chunksize ); return ""; }
void Alsa9Buf::SetWriteahead( snd_pcm_sframes_t frames ) { preferred_writeahead = frames; SetHWParams(); SetSWParams(); }