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