diff options
Diffstat (limited to 'audio_out.c')
-rw-r--r-- | audio_out.c | 83 |
1 files changed, 79 insertions, 4 deletions
diff --git a/audio_out.c b/audio_out.c index 538438b..e55190a 100644 --- a/audio_out.c +++ b/audio_out.c @@ -38,35 +38,89 @@ static uint32_t audio_out_get_sample_rate(const struct audio_stream *stream) { - return 44100; + struct tinyalsa_audio_stream_out *stream_out; + + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + return stream_out->rate; } static int audio_out_set_sample_rate(struct audio_stream *stream, uint32_t rate) { + struct tinyalsa_audio_stream_out *stream_out; + LOGD("%s(%p, %d)", __func__, stream, rate); + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + // FIXME: If rate is different, change resampler + stream_out->rate = rate; + return 0; } static size_t audio_out_get_buffer_size(const struct audio_stream *stream) { - return 4096; + struct tinyalsa_audio_stream_out *stream_out; + size_t size; + + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + size = (stream_out->mixer_props->period_size * stream_out->rate) / + stream_out->rate; + size = ((size + 15) / 16) * 16; + size = size * audio_stream_frame_size((struct audio_stream *) stream); + + return size; } static uint32_t audio_out_get_channels(const struct audio_stream *stream) { - return AUDIO_CHANNEL_OUT_STEREO; + struct tinyalsa_audio_stream_out *stream_out; + + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + return stream_out->channels; } static int audio_out_get_format(const struct audio_stream *stream) { - return AUDIO_FORMAT_PCM_16_BIT; + struct tinyalsa_audio_stream_out *stream_out; + + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + return stream_out->format; } static int audio_out_set_format(struct audio_stream *stream, int format) { + struct tinyalsa_audio_stream_out *stream_out; + LOGD("%s(%p, %d)", __func__, stream, format); + if(stream == NULL) + return -1; + + stream_out = (struct tinyalsa_audio_stream_out *) stream; + + // FIXME: If format is different, change resampler + stream_out->format = format; + return 0; } @@ -214,7 +268,28 @@ int audio_hw_open_output_stream(struct audio_hw_device *dev, stream->write = audio_out_write; stream->get_render_position = audio_out_get_render_position; + if(tinyalsa_audio_device->mixer == NULL) + goto error_stream; + + tinyalsa_audio_stream_out->mixer_props = + tinyalsa_mixer_get_output_props(tinyalsa_audio_device->mixer); + + if(tinyalsa_audio_stream_out->mixer_props == NULL) + goto error_stream; + + tinyalsa_audio_stream_out->rate = + tinyalsa_audio_stream_out->mixer_props->rate; + tinyalsa_audio_stream_out->channels = + tinyalsa_audio_stream_out->mixer_props->channels; + tinyalsa_audio_stream_out->format = + tinyalsa_audio_stream_out->mixer_props->format; + *stream_out = stream; return 0; + +error_stream: + *stream_out = NULL; + + return -1; } |