IMuteSolo.c revision 61ac0ade16f84d877dfd8d0e984eb203d4a2901d
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 2161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IMuteSolo_SetChannelMute(SLMuteSoloItf self, SLuint8 chan, 2261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLboolean mute) 2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 2561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = 1 << chan; 2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_exclusive(this); 2761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (mute) 2861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mMuteMask |= mask; 2961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten else 3061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mMuteMask &= ~mask; 3161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_exclusive(this); 3261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 3461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 3561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IMuteSolo_GetChannelMute(SLMuteSoloItf self, SLuint8 chan, 3661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLboolean *pMute) 3761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 3861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pMute) 3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 4061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_peek(this); 4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = this->mMuteMask; 4361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_peek(this); 4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pMute = (mask >> chan) & 1; 4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IMuteSolo_SetChannelSolo(SLMuteSoloItf self, SLuint8 chan, 4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLboolean solo) 5061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 5261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = 1 << chan; 5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_exclusive(this); 5461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (solo) 5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mSoloMask |= mask; 5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten else 5761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mSoloMask &= ~mask; 5861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_exclusive(this); 5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 6061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 6161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 6261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IMuteSolo_GetChannelSolo(SLMuteSoloItf self, SLuint8 chan, 6361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLboolean *pSolo) 6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 6561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pSolo) 6661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_lock_peek(this); 6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 mask = this->mSoloMask; 7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten interface_unlock_peek(this); 7161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pSolo = (mask >> chan) & 1; 7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IMuteSolo_GetNumChannels(SLMuteSoloItf self, 7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint8 *pNumChannels) 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == pNumChannels) 7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_PARAMETER_INVALID; 8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 8161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // FIXME const 8261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLuint32 numChannels = this->mNumChannels; 8361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *pNumChannels = numChannels; 8461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return SL_RESULT_SUCCESS; 8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 8661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLMuteSoloItf_ IMuteSolo_Itf = { 8861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_SetChannelMute, 8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetChannelMute, 9061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_SetChannelSolo, 9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetChannelSolo, 9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo_GetNumChannels 9361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 9461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IMuteSolo_init(void *self) 9661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 9761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IMuteSolo *this = (IMuteSolo *) self; 9861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mItf = &IMuteSolo_Itf; 9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 100