Complete non-blocking example
This commit is contained in:
parent
0960e3a025
commit
1f7904fab8
1 changed files with 7 additions and 13 deletions
20
alsa_info.md
20
alsa_info.md
|
|
@ -520,17 +520,20 @@ int main(int argc, char **argv)
|
||||||
int period_time = 0;
|
int period_time = 0;
|
||||||
char my_samples[SAMPLE_BUFFER_SIZE];
|
char my_samples[SAMPLE_BUFFER_SIZE];
|
||||||
|
|
||||||
// setup stuff...
|
// Open PCM in non-blocking
|
||||||
|
snd_pcm_open(&handle, "default:CARD=MyAwesomeAudioCard", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
|
||||||
|
|
||||||
|
// setup rest of stuff...
|
||||||
|
|
||||||
// Prepare codec for output
|
// Prepare codec for output
|
||||||
snd_pcm_drop(handle); // Just to be sure...
|
snd_pcm_drop(handle); // Just to be sure...
|
||||||
snd_pcm_prepare(handle);
|
snd_pcm_prepare(handle);
|
||||||
|
|
||||||
// ALSA gods demand their buffers to be prefilled with 2 period sizes!
|
// ALSA gods demand their buffers to be prefilled with 2 period sizes!
|
||||||
snd_pcm_non_block(handle, 0);
|
snd_pcm_non_block(handle, 0); // We want to block for the prefill
|
||||||
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
||||||
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
||||||
snd_pcm_non_block(handle, 1);
|
snd_pcm_non_block(handle, 1); // get back to non-blocking
|
||||||
|
|
||||||
// Codec is started after this
|
// Codec is started after this
|
||||||
snd_pcm_state(handle) == SND_PCM_STATE_RUNNING;
|
snd_pcm_state(handle) == SND_PCM_STATE_RUNNING;
|
||||||
|
|
@ -542,16 +545,7 @@ int main(int argc, char **argv)
|
||||||
sleep(100);
|
sleep(100);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (error < 0) {
|
// xrun recovery stuff
|
||||||
// xrun recovery
|
|
||||||
int recover = snd_pcm_recover(handle, error, 1);
|
|
||||||
if (recover < 0) {
|
|
||||||
// all hope is lost....
|
|
||||||
}
|
|
||||||
// After recovery, need to prefill codec again!
|
|
||||||
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
|
||||||
snd_pcm_writei(handle, my_samples, AUDIO_NR_OF_SAMPLES);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue