IMuteSolo.c revision daf661248ff6ea2e21799e5114c78b7c1d49630e
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/* MuteSolo implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_SetChannelMute(SLMuteSoloItf self, SLuint8 chan, SLboolean mute) 2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 24daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten if (this->mNumChannels <= chan) 25daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = 1 << chan; 2761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_exclusive(this); 2861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (mute) 2961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mMuteMask |= mask; 3061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten else 3161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mMuteMask &= ~mask; 3261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_exclusive(this); 3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 3561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 36daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetChannelMute(SLMuteSoloItf self, SLuint8 chan, SLboolean *pMute) 3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pMute) 3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 41daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten if (this->mNumChannels <= chan) 42daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_peek(this); 4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = this->mMuteMask; 4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_peek(this); 4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pMute = (mask >> chan) & 1; 4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 50daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_SetChannelSolo(SLMuteSoloItf self, SLuint8 chan, SLboolean solo) 5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 53daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten if (this->mNumChannels <= chan) 54daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = 1 << chan; 5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_exclusive(this); 5761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (solo) 5861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mSoloMask |= mask; 5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten else 6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mSoloMask &= ~mask; 6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_exclusive(this); 6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 65daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetChannelSolo(SLMuteSoloItf self, SLuint8 chan, SLboolean *pSolo) 6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pSolo) 6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 70daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten if (this->mNumChannels <= chan) 71daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_peek(this); 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = this->mSoloMask; 7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_peek(this); 7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pSolo = (mask >> chan) & 1; 7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 79daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetNumChannels(SLMuteSoloItf self, SLuint8 *pNumChannels) 8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 8161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pNumChannels) 8261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 8361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 84daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten // no lock needed as mNumChannels is const 8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 numChannels = this->mNumChannels; 8661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pNumChannels = numChannels; 8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 8861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLMuteSoloItf_ IMuteSolo_Itf = { 9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_SetChannelMute, 9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetChannelMute, 9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_SetChannelSolo, 9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetChannelSolo, 9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetNumChannels 9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 9861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IMuteSolo_init(void *self) 9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 10161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mItf = &IMuteSolo_Itf; 1020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifndef NDEBUG 1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mMuteMask = 0; 1040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mSoloMask = 0; 1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 1060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mNumChannels = 2; 10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 108