mirror of
https://github.com/Ryujinx/libsoundio.git
synced 2025-01-18 17:07:19 +00:00
default sample rate is not as important as I thought
This commit is contained in:
parent
c39c1ab9f4
commit
c760bc4df7
|
@ -115,8 +115,6 @@ view `coverage/index.html` in a browser.
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
0. ALSA `list_devices` should list default, dmix, etc.
|
|
||||||
0. ALSA default devices are "default" and "default" respectively
|
|
||||||
0. implement ALSA (Linux) backend, get examples working
|
0. implement ALSA (Linux) backend, get examples working
|
||||||
0. pipe record to playback example working with dummy linux, osx, windows
|
0. pipe record to playback example working with dummy linux, osx, windows
|
||||||
0. pipe record to playback example working with pulseaudio linux
|
0. pipe record to playback example working with pulseaudio linux
|
||||||
|
|
|
@ -79,11 +79,11 @@ int main(int argc, char **argv) {
|
||||||
double latency = 0.1;
|
double latency = 0.1;
|
||||||
|
|
||||||
struct SoundIoInputDevice *input_device;
|
struct SoundIoInputDevice *input_device;
|
||||||
soundio_input_device_create(in_device, SoundIoSampleFormatFloat, latency, NULL,
|
soundio_input_device_create(in_device, SoundIoSampleFormatFloat, 48000, latency, NULL,
|
||||||
read_callback, &input_device);
|
read_callback, &input_device);
|
||||||
|
|
||||||
struct SoundIoOutputDevice *output_device;
|
struct SoundIoOutputDevice *output_device;
|
||||||
soundio_output_device_create(out_device, SoundIoSampleFormatFloat, latency, NULL,
|
soundio_output_device_create(out_device, SoundIoSampleFormatFloat, 48000, latency, NULL,
|
||||||
write_callback, underrun_callback, &output_device);
|
write_callback, underrun_callback, &output_device);
|
||||||
|
|
||||||
if ((err = soundio_input_device_start(input_device)))
|
if ((err = soundio_input_device_start(input_device)))
|
||||||
|
|
|
@ -30,7 +30,7 @@ static float seconds_offset = 0.0f;
|
||||||
|
|
||||||
static void write_callback(struct SoundIoOutputDevice *output_device, int requested_frame_count) {
|
static void write_callback(struct SoundIoOutputDevice *output_device, int requested_frame_count) {
|
||||||
//device->bytes_per_frame;
|
//device->bytes_per_frame;
|
||||||
float float_sample_rate = output_device->device->default_sample_rate;
|
float float_sample_rate = output_device->sample_rate;
|
||||||
float seconds_per_frame = 1.0f / float_sample_rate;
|
float seconds_per_frame = 1.0f / float_sample_rate;
|
||||||
|
|
||||||
while (requested_frame_count > 0) {
|
while (requested_frame_count > 0) {
|
||||||
|
@ -90,8 +90,8 @@ int main(int argc, char **argv) {
|
||||||
soundio_device_description(device));
|
soundio_device_description(device));
|
||||||
|
|
||||||
struct SoundIoOutputDevice *output_device;
|
struct SoundIoOutputDevice *output_device;
|
||||||
soundio_output_device_create(device, SoundIoSampleFormatFloat, 0.1, NULL,
|
soundio_output_device_create(device, SoundIoSampleFormatFloat, 48000,
|
||||||
write_callback, underrun_callback, &output_device);
|
0.1, NULL, write_callback, underrun_callback, &output_device);
|
||||||
|
|
||||||
if ((err = soundio_output_device_start(output_device)))
|
if ((err = soundio_output_device_start(output_device)))
|
||||||
panic("unable to start device: %s", soundio_error_string(err));
|
panic("unable to start device: %s", soundio_error_string(err));
|
||||||
|
|
|
@ -35,13 +35,12 @@ struct SoundIoDummy {
|
||||||
|
|
||||||
static void playback_thread_run(void *arg) {
|
static void playback_thread_run(void *arg) {
|
||||||
SoundIoOutputDevice *output_device = (SoundIoOutputDevice *)arg;
|
SoundIoOutputDevice *output_device = (SoundIoOutputDevice *)arg;
|
||||||
SoundIoDevice *device = output_device->device;
|
|
||||||
SoundIoOutputDeviceDummy *opd = (SoundIoOutputDeviceDummy *)output_device->backend_data;
|
SoundIoOutputDeviceDummy *opd = (SoundIoOutputDeviceDummy *)output_device->backend_data;
|
||||||
|
|
||||||
double start_time = soundio_os_get_time();
|
double start_time = soundio_os_get_time();
|
||||||
long frames_consumed = 0;
|
long frames_consumed = 0;
|
||||||
|
|
||||||
double time_per_frame = 1.0 / (double)device->default_sample_rate;
|
double time_per_frame = 1.0 / (double)output_device->sample_rate;
|
||||||
while (opd->abort_flag.test_and_set()) {
|
while (opd->abort_flag.test_and_set()) {
|
||||||
soundio_os_cond_timed_wait(opd->cond, nullptr, opd->period);
|
soundio_os_cond_timed_wait(opd->cond, nullptr, opd->period);
|
||||||
|
|
||||||
|
@ -143,8 +142,7 @@ static int output_device_init_dummy(SoundIo *soundio,
|
||||||
}
|
}
|
||||||
output_device->backend_data = opd;
|
output_device->backend_data = opd;
|
||||||
|
|
||||||
SoundIoDevice *device = output_device->device;
|
int buffer_frame_count = output_device->latency * output_device->sample_rate;
|
||||||
int buffer_frame_count = output_device->latency * device->default_sample_rate;
|
|
||||||
opd->buffer_size = output_device->bytes_per_frame * buffer_frame_count;
|
opd->buffer_size = output_device->bytes_per_frame * buffer_frame_count;
|
||||||
opd->period = output_device->latency * 0.5;
|
opd->period = output_device->latency * 0.5;
|
||||||
|
|
||||||
|
|
|
@ -581,7 +581,7 @@ static int output_device_init_pa(SoundIo *soundio,
|
||||||
|
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
sample_spec.format = to_pulseaudio_sample_format(output_device->sample_format);
|
sample_spec.format = to_pulseaudio_sample_format(output_device->sample_format);
|
||||||
sample_spec.rate = device->default_sample_rate;
|
sample_spec.rate = output_device->sample_rate;
|
||||||
sample_spec.channels = device->channel_layout.channel_count;
|
sample_spec.channels = device->channel_layout.channel_count;
|
||||||
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
|
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
|
||||||
|
|
||||||
|
@ -595,7 +595,7 @@ static int output_device_init_pa(SoundIo *soundio,
|
||||||
pa_stream_set_write_callback(opd->stream, playback_stream_write_callback, output_device);
|
pa_stream_set_write_callback(opd->stream, playback_stream_write_callback, output_device);
|
||||||
pa_stream_set_underflow_callback(opd->stream, playback_stream_underflow_callback, output_device);
|
pa_stream_set_underflow_callback(opd->stream, playback_stream_underflow_callback, output_device);
|
||||||
|
|
||||||
int bytes_per_second = output_device->bytes_per_frame * device->default_sample_rate;
|
int bytes_per_second = output_device->bytes_per_frame * output_device->sample_rate;
|
||||||
int buffer_length = output_device->bytes_per_frame *
|
int buffer_length = output_device->bytes_per_frame *
|
||||||
ceil(output_device->latency * bytes_per_second / (double)output_device->bytes_per_frame);
|
ceil(output_device->latency * bytes_per_second / (double)output_device->bytes_per_frame);
|
||||||
|
|
||||||
|
@ -747,7 +747,7 @@ static int input_device_init_pa(SoundIo *soundio,
|
||||||
|
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
sample_spec.format = to_pulseaudio_sample_format(input_device->sample_format);
|
sample_spec.format = to_pulseaudio_sample_format(input_device->sample_format);
|
||||||
sample_spec.rate = device->default_sample_rate;
|
sample_spec.rate = input_device->sample_rate;
|
||||||
sample_spec.channels = device->channel_layout.channel_count;
|
sample_spec.channels = device->channel_layout.channel_count;
|
||||||
|
|
||||||
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
|
pa_channel_map channel_map = to_pulseaudio_channel_map(&device->channel_layout);
|
||||||
|
@ -764,7 +764,7 @@ static int input_device_init_pa(SoundIo *soundio,
|
||||||
pa_stream_set_state_callback(stream, recording_stream_state_callback, input_device);
|
pa_stream_set_state_callback(stream, recording_stream_state_callback, input_device);
|
||||||
pa_stream_set_read_callback(stream, recording_stream_read_callback, input_device);
|
pa_stream_set_read_callback(stream, recording_stream_read_callback, input_device);
|
||||||
|
|
||||||
int bytes_per_second = input_device->bytes_per_frame * device->default_sample_rate;
|
int bytes_per_second = input_device->bytes_per_frame * input_device->sample_rate;
|
||||||
int buffer_length = input_device->bytes_per_frame *
|
int buffer_length = input_device->bytes_per_frame *
|
||||||
ceil(input_device->latency * bytes_per_second / (double)input_device->bytes_per_frame);
|
ceil(input_device->latency * bytes_per_second / (double)input_device->bytes_per_frame);
|
||||||
|
|
||||||
|
|
|
@ -290,7 +290,7 @@ void soundio_output_device_write(struct SoundIoOutputDevice *output_device,
|
||||||
|
|
||||||
|
|
||||||
int soundio_output_device_create(struct SoundIoDevice *device,
|
int soundio_output_device_create(struct SoundIoDevice *device,
|
||||||
enum SoundIoSampleFormat sample_format,
|
enum SoundIoSampleFormat sample_format, int sample_rate,
|
||||||
double latency, void *userdata,
|
double latency, void *userdata,
|
||||||
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
|
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
|
||||||
void (*underrun_callback)(struct SoundIoOutputDevice *),
|
void (*underrun_callback)(struct SoundIoOutputDevice *),
|
||||||
|
@ -310,6 +310,7 @@ int soundio_output_device_create(struct SoundIoDevice *device,
|
||||||
output_device->write_callback = write_callback;
|
output_device->write_callback = write_callback;
|
||||||
output_device->underrun_callback = underrun_callback;
|
output_device->underrun_callback = underrun_callback;
|
||||||
output_device->sample_format = sample_format;
|
output_device->sample_format = sample_format;
|
||||||
|
output_device->sample_rate = sample_rate;
|
||||||
output_device->latency = latency;
|
output_device->latency = latency;
|
||||||
output_device->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
|
output_device->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
|
||||||
device->channel_layout.channel_count);
|
device->channel_layout.channel_count);
|
||||||
|
@ -344,7 +345,8 @@ int soundio_output_device_start(struct SoundIoOutputDevice *output_device) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int soundio_input_device_create(struct SoundIoDevice *device,
|
int soundio_input_device_create(struct SoundIoDevice *device,
|
||||||
enum SoundIoSampleFormat sample_format, double latency, void *userdata,
|
enum SoundIoSampleFormat sample_format, int sample_rate,
|
||||||
|
double latency, void *userdata,
|
||||||
void (*read_callback)(struct SoundIoInputDevice *),
|
void (*read_callback)(struct SoundIoInputDevice *),
|
||||||
struct SoundIoInputDevice **out_input_device)
|
struct SoundIoInputDevice **out_input_device)
|
||||||
{
|
{
|
||||||
|
@ -362,6 +364,7 @@ int soundio_input_device_create(struct SoundIoDevice *device,
|
||||||
sid->read_callback = read_callback;
|
sid->read_callback = read_callback;
|
||||||
sid->sample_format = sample_format;
|
sid->sample_format = sample_format;
|
||||||
sid->latency = latency;
|
sid->latency = latency;
|
||||||
|
sid->sample_rate = sample_rate;
|
||||||
sid->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
|
sid->bytes_per_frame = soundio_get_bytes_per_frame(sample_format,
|
||||||
device->channel_layout.channel_count);
|
device->channel_layout.channel_count);
|
||||||
|
|
||||||
|
|
|
@ -115,9 +115,15 @@ struct SoundIoDevice {
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
char *description;
|
||||||
struct SoundIoChannelLayout channel_layout;
|
struct SoundIoChannelLayout channel_layout;
|
||||||
|
|
||||||
|
// these values might not actually matter. audio hardware has a set of
|
||||||
|
// {sample format, sample rate} that they support. you can't know
|
||||||
|
// whether something worked until you try it.
|
||||||
|
// these values can be unknown
|
||||||
enum SoundIoSampleFormat default_sample_format;
|
enum SoundIoSampleFormat default_sample_format;
|
||||||
double default_latency;
|
|
||||||
int default_sample_rate;
|
int default_sample_rate;
|
||||||
|
|
||||||
|
double default_latency;
|
||||||
enum SoundIoDevicePurpose purpose;
|
enum SoundIoDevicePurpose purpose;
|
||||||
int ref_count;
|
int ref_count;
|
||||||
bool is_raw;
|
bool is_raw;
|
||||||
|
@ -127,6 +133,7 @@ struct SoundIoOutputDevice {
|
||||||
void *backend_data;
|
void *backend_data;
|
||||||
struct SoundIoDevice *device;
|
struct SoundIoDevice *device;
|
||||||
enum SoundIoSampleFormat sample_format;
|
enum SoundIoSampleFormat sample_format;
|
||||||
|
int sample_rate;
|
||||||
double latency;
|
double latency;
|
||||||
int bytes_per_frame;
|
int bytes_per_frame;
|
||||||
|
|
||||||
|
@ -139,6 +146,7 @@ struct SoundIoInputDevice {
|
||||||
void *backend_data;
|
void *backend_data;
|
||||||
struct SoundIoDevice *device;
|
struct SoundIoDevice *device;
|
||||||
enum SoundIoSampleFormat sample_format;
|
enum SoundIoSampleFormat sample_format;
|
||||||
|
int sample_rate;
|
||||||
double latency;
|
double latency;
|
||||||
int bytes_per_frame;
|
int bytes_per_frame;
|
||||||
|
|
||||||
|
@ -283,7 +291,7 @@ enum SoundIoDevicePurpose soundio_device_purpose(const struct SoundIoDevice *dev
|
||||||
// Output Devices
|
// Output Devices
|
||||||
|
|
||||||
int soundio_output_device_create(struct SoundIoDevice *device,
|
int soundio_output_device_create(struct SoundIoDevice *device,
|
||||||
enum SoundIoSampleFormat sample_format,
|
enum SoundIoSampleFormat sample_format, int sample_rate,
|
||||||
double latency, void *userdata,
|
double latency, void *userdata,
|
||||||
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
|
void (*write_callback)(struct SoundIoOutputDevice *, int frame_count),
|
||||||
void (*underrun_callback)(struct SoundIoOutputDevice *),
|
void (*underrun_callback)(struct SoundIoOutputDevice *),
|
||||||
|
@ -309,7 +317,8 @@ void soundio_output_device_clear_buffer(struct SoundIoOutputDevice *output_devic
|
||||||
// Input Devices
|
// Input Devices
|
||||||
|
|
||||||
int soundio_input_device_create(struct SoundIoDevice *device,
|
int soundio_input_device_create(struct SoundIoDevice *device,
|
||||||
enum SoundIoSampleFormat sample_format, double latency, void *userdata,
|
enum SoundIoSampleFormat sample_format, int sample_rate,
|
||||||
|
double latency, void *userdata,
|
||||||
void (*read_callback)(struct SoundIoInputDevice *),
|
void (*read_callback)(struct SoundIoInputDevice *),
|
||||||
struct SoundIoInputDevice **out_input_device);
|
struct SoundIoInputDevice **out_input_device);
|
||||||
void soundio_input_device_destroy(struct SoundIoInputDevice *input_device);
|
void soundio_input_device_destroy(struct SoundIoInputDevice *input_device);
|
||||||
|
|
|
@ -37,7 +37,7 @@ static void test_create_output_device(void) {
|
||||||
soundio_device_name(device);
|
soundio_device_name(device);
|
||||||
soundio_device_description(device);
|
soundio_device_description(device);
|
||||||
struct SoundIoOutputDevice *output_device;
|
struct SoundIoOutputDevice *output_device;
|
||||||
soundio_output_device_create(device, SoundIoSampleFormatFloat, 0.1, NULL,
|
soundio_output_device_create(device, SoundIoSampleFormatFloat, 48000, 0.1, NULL,
|
||||||
write_callback, underrun_callback, &output_device);
|
write_callback, underrun_callback, &output_device);
|
||||||
soundio_output_device_destroy(output_device);
|
soundio_output_device_destroy(output_device);
|
||||||
soundio_device_unref(device);
|
soundio_device_unref(device);
|
||||||
|
|
Loading…
Reference in a new issue