diff options
author | Josep Torra <n770galaxy@gmail.com> | 2012-09-21 14:15:12 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 14:03:08 +0200 |
commit | c006973a4eb881a3dc93d84b976b83bcd0ce3fae (patch) | |
tree | bd5a300fe8bc2cf53476fd9b73a2207735c09a58 /sys/opensles/openslessink.c | |
parent | 85bd75a2b1f252f778958a4d87acfe0b74751efa (diff) | |
download | gstreamer-plugins-bad-c006973a4eb881a3dc93d84b976b83bcd0ce3fae.tar.gz |
opensles: attempt to query device for capabilities
Diffstat (limited to 'sys/opensles/openslessink.c')
-rw-r--r-- | sys/opensles/openslessink.c | 102 |
1 files changed, 101 insertions, 1 deletions
diff --git a/sys/opensles/openslessink.c b/sys/opensles/openslessink.c index 0368c374a..b70c603c8 100644 --- a/sys/opensles/openslessink.c +++ b/sys/opensles/openslessink.c @@ -37,7 +37,9 @@ enum #define DEFAULT_VOLUME 1.0 #define DEFAULT_MUTE FALSE -#define RATES "8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 192000" + +/* According to Android's NDK doc the following are the supported rates */ +#define RATES "8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000" static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -92,6 +94,102 @@ gst_opensles_sink_create_ringbuffer (GstBaseAudioSink * base) return rb; } +#define AUDIO_OUTPUT_DESC_FORMAT \ + "deviceName: %s deviceConnection: %d deviceScope: %d deviceLocation: %d " \ + "isForTelephony: %d minSampleRate: %d maxSampleRate: %d " \ + "isFreqRangeContinuous: %d maxChannels: %d" + +#define AUDIO_OUTPUT_DESC_ARGS(aod) \ + (gchar*) (aod)->pDeviceName, (gint) (aod)->deviceConnection, \ + (gint) (aod)->deviceScope, (gint) (aod)->deviceLocation, \ + (gint) (aod)->isForTelephony, (gint) (aod)->minSampleRate, \ + (gint) (aod)->maxSampleRate, (gint) (aod)->isFreqRangeContinuous, \ + (gint) (aod)->maxChannels + +/* Next it's not defined in Android */ +#ifndef MAX_NUMBER_OUTPUT_DEVICES +#define MAX_NUMBER_OUTPUT_DEVICES 16 +#endif + +static gboolean +_opensles_query_capabilities (GstOpenSLESSink * sink) +{ + gboolean res = FALSE; + SLresult result; + SLObjectItf engineObject = NULL; + SLAudioIODeviceCapabilitiesItf audioIODeviceCapabilities; + SLint32 i, j, numOutputs = MAX_NUMBER_OUTPUT_DEVICES; + SLuint32 outputDeviceIDs[MAX_NUMBER_OUTPUT_DEVICES]; + SLAudioOutputDescriptor audioOutputDescriptor; + + /* Create engine */ + result = slCreateEngine (&engineObject, 0, NULL, 0, NULL, NULL); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (sink, "slCreateEngine failed(0x%08x)", (guint32) result); + goto beach; + } + + /* Realize the engine */ + result = (*engineObject)->Realize (engineObject, SL_BOOLEAN_FALSE); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (sink, "engine.Realize failed(0x%08x)", (guint32) result); + goto beach; + } + + /* Get the engine interface, which is needed in order to + * create other objects */ + result = (*engineObject)->GetInterface (engineObject, + SL_IID_AUDIOIODEVICECAPABILITIES, &audioIODeviceCapabilities); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (sink, + "engine.GetInterface(IODeviceCapabilities) failed(0x%08x)", + (guint32) result); + goto beach; + } + + result = (*audioIODeviceCapabilities)->GetAvailableAudioOutputs + (audioIODeviceCapabilities, &numOutputs, outputDeviceIDs); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (sink, + "IODeviceCapabilities.GetAvailableAudioOutputs failed(0x%08x)", + (guint32) result); + goto beach; + } + + GST_DEBUG_OBJECT (sink, "Found %d output devices", (gint32) numOutputs); + + for (i = 0; i < numOutputs; i++) { + result = (*audioIODeviceCapabilities)->QueryAudioOutputCapabilities + (audioIODeviceCapabilities, outputDeviceIDs[i], &audioOutputDescriptor); + if (result != SL_RESULT_SUCCESS) { + GST_ERROR_OBJECT (sink, + "IODeviceCapabilities.QueryAudioOutputCapabilities failed(0x%08x)", + (guint32) result); + continue; + } + + GST_DEBUG_OBJECT (sink, " ID: %08x " AUDIO_OUTPUT_DESC_FORMAT, + (guint) outputDeviceIDs[i], + AUDIO_OUTPUT_DESC_ARGS (&audioOutputDescriptor)); + GST_DEBUG_OBJECT (sink, " Found %d supported sample rated", + audioOutputDescriptor.numOfSamplingRatesSupported); + + for (j = 0; j < audioOutputDescriptor.numOfSamplingRatesSupported; j++) { + GST_DEBUG_OBJECT (sink, " %d Hz", + (gint) audioOutputDescriptor.samplingRatesSupported[j]); + } + } + + res = TRUE; +beach: + /* Destroy engine object */ + if (engineObject) { + (*engineObject)->Destroy (engineObject); + } + + return res; +} + static void gst_opensles_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -167,4 +265,6 @@ gst_opensles_sink_init (GstOpenSLESSink * sink, GstOpenSLESSinkClass * gclass) { sink->volume = DEFAULT_VOLUME; sink->mute = DEFAULT_MUTE; + + _opensles_query_capabilities (sink); } |