mirror of
https://github.com/Ryujinx/libsoundio.git
synced 2024-12-22 22:45:28 +00:00
ALSA: fix playback on raw device
This commit is contained in:
parent
6019d4b964
commit
195ea59209
|
@ -274,7 +274,6 @@ Then look at `html/index.html` in a browser.
|
|||
|
||||
## Roadmap
|
||||
|
||||
0. test sio_sine with ALSA raw device
|
||||
0. Make sure PulseAudio can handle refresh devices crashing before
|
||||
block_until_have_devices
|
||||
0. Integrate into libgroove and test with Groove Basin
|
||||
|
|
|
@ -188,6 +188,11 @@ int main(int argc, char **argv) {
|
|||
|
||||
fprintf(stderr, "Output device: %s\n", device->name);
|
||||
|
||||
if (device->probe_error) {
|
||||
fprintf(stderr, "Cannot probe device: %s\n", soundio_strerror(device->probe_error));
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct SoundIoOutStream *outstream = soundio_outstream_create(device);
|
||||
outstream->write_callback = write_callback;
|
||||
outstream->underflow_callback = underflow_callback;
|
||||
|
|
29
src/alsa.cpp
29
src/alsa.cpp
|
@ -970,6 +970,17 @@ void outstream_thread_run(void *arg) {
|
|||
}
|
||||
case SND_PCM_STATE_PREPARED:
|
||||
{
|
||||
snd_pcm_sframes_t avail = snd_pcm_avail_update(osa->handle);
|
||||
if (avail < 0) {
|
||||
outstream->error_callback(outstream, SoundIoErrorStreaming);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((snd_pcm_uframes_t)avail == osa->buffer_size_frames) {
|
||||
outstream->write_callback(outstream, 0, avail);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((err = snd_pcm_start(osa->handle)) < 0) {
|
||||
outstream->error_callback(outstream, SoundIoErrorStreaming);
|
||||
return;
|
||||
|
@ -1155,6 +1166,13 @@ static int outstream_open_alsa(SoundIoPrivate *si, SoundIoOutStreamPrivate *os)
|
|||
return SoundIoErrorOpeningDevice;
|
||||
}
|
||||
|
||||
osa->buffer_size_frames = ceil(outstream->software_latency * (double)outstream->sample_rate);
|
||||
|
||||
if ((err = snd_pcm_hw_params_set_buffer_size_near(osa->handle, hwparams, &osa->buffer_size_frames)) < 0) {
|
||||
outstream_destroy_alsa(si, os);
|
||||
return SoundIoErrorOpeningDevice;
|
||||
}
|
||||
outstream->software_latency = ((double)osa->buffer_size_frames) / (double)outstream->sample_rate;
|
||||
|
||||
if (device->is_raw) {
|
||||
unsigned int microseconds;
|
||||
|
@ -1172,17 +1190,6 @@ static int outstream_open_alsa(SoundIoPrivate *si, SoundIoOutStreamPrivate *os)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
snd_pcm_uframes_t buffer_size_frames = ceil(outstream->software_latency * (double)outstream->sample_rate);
|
||||
|
||||
if ((err = snd_pcm_hw_params_set_buffer_size_near(osa->handle, hwparams, &buffer_size_frames)) < 0) {
|
||||
outstream_destroy_alsa(si, os);
|
||||
return SoundIoErrorOpeningDevice;
|
||||
}
|
||||
outstream->software_latency = ((double)buffer_size_frames) / (double)outstream->sample_rate;
|
||||
|
||||
|
||||
|
||||
snd_pcm_uframes_t period_size;
|
||||
if ((snd_pcm_hw_params_get_period_size(hwparams, &period_size, nullptr)) < 0) {
|
||||
outstream_destroy_alsa(si, os);
|
||||
|
|
|
@ -42,6 +42,7 @@ struct SoundIoOutStreamAlsa {
|
|||
int chmap_size;
|
||||
snd_pcm_uframes_t offset;
|
||||
snd_pcm_access_t access;
|
||||
snd_pcm_uframes_t buffer_size_frames;
|
||||
int sample_buffer_size;
|
||||
char *sample_buffer;
|
||||
int poll_fd_count;
|
||||
|
|
Loading…
Reference in a new issue