d_period_size (0),
d_buffer_size_bytes (0), d_buffer (0),
d_worker (0), d_special_case_mono_to_stereo (false),
- d_nunderuns (0), d_nsuspends (0), d_ok_to_block(ok_to_block),
- d_change_in_progress(false)
+ d_nunderuns (0), d_nsuspends (0), d_ok_to_block(ok_to_block)
{
CHATTY_DEBUG = gr_prefs::singleton()->get_bool("audio_alsa", "verbose", false);
// FIXME check_topology may be called more than once.
// Ensure that the pcm is in a state where we can still mess with the hw_params
- d_change_in_progress = true;
-
- if (snd_pcm_state (d_pcm_handle) == SND_PCM_STATE_RUNNING)
- snd_pcm_drop (d_pcm_handle);
-
bool special_case = nchan == 1 && d_special_case_mono_to_stereo;
if (special_case)
nchan = 2;
if (err < 0){
output_error_msg ("set_channels failed", err);
- d_change_in_progress = false;
return false;
}
err = snd_pcm_hw_params(d_pcm_handle, d_hw_params);
if (err < 0){
output_error_msg ("snd_pcm_hw_params failed", err);
- d_change_in_progress = false;
return false;
}
default:
assert (0);
}
- d_change_in_progress = false;
return true;
}
{
const unsigned char *buffer = (const unsigned char *) vbuffer;
- int change_counter = 10;
- while (d_change_in_progress == true && change_counter >= 0) {
- change_counter--;
- usleep(10000);
- }
- d_change_in_progress = false;
-
while (nframes > 0){
int r = snd_pcm_writei (d_pcm_handle, buffer, nframes);
if (r == -EAGAIN)
// random stats
int d_nunderuns; // count of underruns
int d_nsuspends; // count of suspends
- bool d_change_in_progress; // Topology change in progress--used as spinlock for write_buffer
bool d_ok_to_block; // defaults to "true", controls blocking/non-block I/O
void output_error_msg (const char *msg, int err);