10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/*
20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License.
60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at
70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *
100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software
110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and
140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License.
150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */
160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* OutputMix implementation */
180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "sles_allinclusive.h"
200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
220b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IOutputMix_GetDestinationOutputDeviceIDs(SLOutputMixItf self,
230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten   SLint32 *pNumDevices, SLuint32 *pDeviceIDs)
240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumDevices) {
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
31104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten        // The application can set pDeviceIDs == NULL in order to find out number of devices.
32104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten        // Then the application can allocate a proper-sized device ID array and try again.
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL != pDeviceIDs) {
34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (1 > *pNumDevices) {
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_BUFFER_INSUFFICIENT;
36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            } else {
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                pDeviceIDs[0] = SL_DEFAULTDEVICEID_AUDIOOUTPUT;
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pNumDevices = 1;
410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
470b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IOutputMix_RegisterDeviceChangeCallback(SLOutputMixItf self,
480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    slMixDeviceChangeCallback callback, void *pContext)
490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IOutputMix *thiz = (IOutputMix *) self;
53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_lock_exclusive(thiz);
54bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCallback = callback;
55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mContext = pContext;
56bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    interface_unlock_exclusive(thiz);
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_SUCCESS;
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
630b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IOutputMix_ReRoute(SLOutputMixItf self, SLint32 numOutputDevices,
640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLuint32 *pOutputDeviceIDs)
650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
68104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten    if ((1 != numOutputDevices) || (NULL == pOutputDeviceIDs)) {
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        switch (pOutputDeviceIDs[0]) {
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        case SL_DEFAULTDEVICEID_AUDIOOUTPUT:
73f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten        case DEVICE_ID_HEADSET:
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        default:
77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    }
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
860b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLOutputMixItf_ IOutputMix_Itf = {
870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IOutputMix_GetDestinationOutputDeviceIDs,
880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IOutputMix_RegisterDeviceChangeCallback,
890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IOutputMix_ReRoute
900b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
910b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
920b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IOutputMix_init(void *self)
930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
94bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IOutputMix *thiz = (IOutputMix *) self;
95bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IOutputMix_Itf;
96bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mCallback = NULL;
97bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mContext = NULL;
980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
99