summaryrefslogtreecommitdiffstats
path: root/audio_out.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio_out.c')
-rw-r--r--audio_out.c83
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;
}