161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/*
261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License.
661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at
761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and
1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License.
1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */
1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h"
1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* AudioIODeviceCapabilities implementation */
2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// NTH make it platform-configurable
227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten
23ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAvailableAudioInputs(
25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLint32 *pNumInputs, SLuint32 *pInputDeviceIDs)
2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumInputs) {
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL != pInputDeviceIDs) {
34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (1 > *pNumInputs) {
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_BUFFER_INSUFFICIENT;
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            } else {
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                pInputDeviceIDs[0] = SL_DEFAULTDEVICEID_AUDIOINPUT;
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumInputs = 1;
4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QueryAudioInputCapabilities(
48d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLAudioInputDescriptor *pDescriptor)
4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDescriptor) {
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        switch (deviceID) {
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOINPUT:
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pDescriptor = *AudioInput_id_descriptors[0].descriptor;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        default:
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_IO_ERROR;
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
70d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterAvailableAudioInputsChangedCallback(
71d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, slAvailableAudioInputsChangedCallback callback,
72d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    void *pContext)
7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
76f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten    IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self;
77bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_exclusive(thiz);
78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioInputsChangedCallback = callback;
79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioInputsChangedContext = pContext;
80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_exclusive(thiz);
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
8461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAvailableAudioOutputs(
88d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLint32 *pNumOutputs, SLuint32 *pOutputDeviceIDs)
8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumOutputs) {
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL != pOutputDeviceIDs) {
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (2 > *pNumOutputs) {
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_BUFFER_INSUFFICIENT;
997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten                // if 1 slot available, should still fill that
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            } else {
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                pOutputDeviceIDs[0] = DEVICE_ID_HEADSET;
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                pOutputDeviceIDs[1] = DEVICE_ID_HANDSFREE;
1037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten                // SL_DEFAULTDEVICEID_AUDIOOUTPUT?
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumOutputs = 2;
10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QueryAudioOutputCapabilities(
114d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLAudioOutputDescriptor *pDescriptor)
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDescriptor) {
119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        switch (deviceID) {
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case DEVICE_ID_HEADSET:
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pDescriptor = *AudioOutput_id_descriptors[1].descriptor;
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case DEVICE_ID_HANDSFREE:
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pDescriptor = *AudioOutput_id_descriptors[2].descriptor;
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
1297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        // SL_DEFAULTDEVICEID_AUDIOOUTPUT?
130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        default:
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_IO_ERROR;
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
13461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterAvailableAudioOutputsChangedCallback(
141d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, slAvailableAudioOutputsChangedCallback callback,
142d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    void *pContext)
14361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
146f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten    IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self;
147bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_exclusive(thiz);
148bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioOutputsChangedCallback = callback;
149bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioOutputsChangedContext = pContext;
150bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_exclusive(thiz);
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
15461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
15561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
157d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterDefaultDeviceIDMapChangedCallback(
158d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, slDefaultDeviceIDMapChangedCallback callback,
159d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    void *pContext)
16061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
163f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten    IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self;
164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_exclusive(thiz);
165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mDefaultDeviceIDMapChangedCallback = callback;
166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mDefaultDeviceIDMapChangedContext = pContext;
167bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_exclusive(thiz);
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
17161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
17261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
17461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAssociatedAudioInputs(
17561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID,
17661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLint32 *pNumAudioInputs, SLuint32 *pAudioInputDeviceIDs)
17761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumAudioInputs) {
181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
1837a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        // Incomplete
184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumAudioInputs = 0;
185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
19061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
19261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAssociatedAudioOutputs(
19361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID,
19461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLint32 *pNumAudioOutputs, SLuint32 *pAudioOutputDeviceIDs)
19561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
196ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
197ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumAudioOutputs) {
199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
200ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
2017a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten        // Incomplete
202ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumAudioOutputs = 0;
203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
204ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
205ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
206ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
20761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
20861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
21061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetDefaultAudioDevices(
21161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 defaultDeviceID,
21261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SLint32 *pNumAudioDevices, SLuint32 *pAudioDeviceIDs)
21361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
214ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumAudioDevices) {
217ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
218ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
219a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        switch (defaultDeviceID) {
220a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOINPUT:
221a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (NULL != pAudioDeviceIDs) {
224ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                switch (defaultDeviceID) {
225ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                case SL_DEFAULTDEVICEID_AUDIOINPUT:
226ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    if (1 > *pNumAudioDevices) {
227ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        result = SL_RESULT_BUFFER_INSUFFICIENT;
228ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    } else {
229ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        pAudioDeviceIDs[0] = SL_DEFAULTDEVICEID_AUDIOINPUT;
230ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    }
231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    *pNumAudioDevices = 1;
232ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    break;
233ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
234ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    if (2 > *pNumAudioDevices) {
235ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        result = SL_RESULT_BUFFER_INSUFFICIENT;
236ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    } else {
237ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        pAudioDeviceIDs[0] = DEVICE_ID_HEADSET;
238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        pAudioDeviceIDs[1] = DEVICE_ID_HANDSFREE;
2397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten                        // should be capable of returning first item if 1 slot
240ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    }
241ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    *pNumAudioDevices = 2;
242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    break;
243ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                default:
244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    assert(SL_BOOLEAN_FALSE);
245ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    *pNumAudioDevices = 0;
246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    break;
247ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                }
248ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
249a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            break;
250a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        default:
251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_IO_ERROR;
252a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten            break;
253a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten        }
25461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
255ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
256ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
25761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
25861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
259ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
26061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QuerySampleFormatsSupported(
261d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLmilliHertz samplingRate,
262d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    SLint32 *pSampleFormats, SLint32 *pNumOfSampleFormats)
26361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
264ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
265ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
266ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumOfSampleFormats) {
267ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
268ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
269ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        switch (deviceID) {
270ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOINPUT:
271ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
272ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
2737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            // incomplete
274ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            switch (samplingRate) {
275ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            case SL_SAMPLINGRATE_44_1:
276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                break;
277ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            default:
278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_IO_ERROR;
279ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                break;
280ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (NULL != pSampleFormats) {
282ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                if (1 > *pNumOfSampleFormats)
283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                    result = SL_RESULT_BUFFER_INSUFFICIENT;
2847a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten                // incomplete
285ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                pSampleFormats[0] = SL_PCMSAMPLEFORMAT_FIXED_16;
286ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
287ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            *pNumOfSampleFormats = 1;
288ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
289ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        default:
290ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_IO_ERROR;
291ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
292ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
29361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    }
294ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
295ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
29661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
29761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
298ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
29961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLAudioIODeviceCapabilitiesItf_ IAudioIODeviceCapabilities_Itf = {
30061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_GetAvailableAudioInputs,
30161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_QueryAudioInputCapabilities,
30261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_RegisterAvailableAudioInputsChangedCallback,
30361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_GetAvailableAudioOutputs,
30461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_QueryAudioOutputCapabilities,
30561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_RegisterAvailableAudioOutputsChangedCallback,
30661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_RegisterDefaultDeviceIDMapChangedCallback,
30761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_GetAssociatedAudioInputs,
30861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_GetAssociatedAudioOutputs,
30961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_GetDefaultAudioDevices,
31061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IAudioIODeviceCapabilities_QuerySampleFormatsSupported
31161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
31261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
31361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IAudioIODeviceCapabilities_init(void *self)
31461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
315bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IAudioIODeviceCapabilities *thiz = (IAudioIODeviceCapabilities *) self;
316bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IAudioIODeviceCapabilities_Itf;
317bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioInputsChangedCallback = NULL;
318bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioInputsChangedContext = NULL;
319bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioOutputsChangedCallback = NULL;
320bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mAvailableAudioOutputsChangedContext = NULL;
321bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mDefaultDeviceIDMapChangedCallback = NULL;
322bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mDefaultDeviceIDMapChangedContext = NULL;
32361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
324