IMIDIMuteSolo.c revision e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037
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/* MIDIMuteSolo implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#include "sles_allinclusive.h" 200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 21e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IMIDIMuteSolo_SetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, 22e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean mute) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (channel > 15) 25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint16 mask = 1 << channel; 280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (mute) 300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelMuteMask |= mask; 310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten else 320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelMuteMask &= ~mask; 330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 370b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, 380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLboolean *pMute) 390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 40d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (channel > 15 || (NULL == pMute)) 410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint16 mask = this->mChannelMuteMask; 450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMute = (mask >> channel) & 1; 470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 480b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 50e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IMIDIMuteSolo_SetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, 51e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean solo) 520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 53d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (channel > 15) 54d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint16 mask = 1 << channel; 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (solo) 590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelSoloMask |= mask; 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten else 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelSoloMask &= ~mask; 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 660b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, 670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLboolean *pSolo) 680b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 69d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (channel > 15 || (NULL == pSolo)) 700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 710b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 720b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 730b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint16 mask = this->mChannelSoloMask; 740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pSolo = (mask >> channel) & 1; 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 790b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackCount(SLMIDIMuteSoloItf self, SLuint16 *pCount) 800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (NULL == pCount) 820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 830b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 84d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const, so no lock needed 850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint16 trackCount = this->mTrackCount; 860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pCount = trackCount; 870b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 900b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_SetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean mute) 910b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 920b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 93d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 94d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!(track < this->mTrackCount)) 95d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 mask = 1 << track; 970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (mute) 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackMuteMask |= mask; 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten else 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackMuteMask &= ~mask; 1020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 1030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1060b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pMute) 1070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 109d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const, no lock needed 110d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!(track < this->mTrackCount) || NULL == pMute) 111d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 1130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 mask = this->mTrackMuteMask; 1140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 1150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pMute = (mask >> track) & 1; 1160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1190b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_SetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean solo) 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 122d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 123d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!(track < this->mTrackCount)) 124d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 mask = 1 << track; 1260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_exclusive(this); 1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten if (solo) 1280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackSoloMask |= mask; 1290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten else 1300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackSoloMask &= ~mask; 1310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_exclusive(this); 1320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1350b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pSolo) 1360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 138d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const, no lock needed 139d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten if (!(track < this->mTrackCount) || NULL == pSolo) 140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten return SL_RESULT_PARAMETER_INVALID; 1410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_lock_peek(this); 1420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 mask = this->mTrackSoloMask; 1430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten interface_unlock_peek(this); 1440b167267bda99b68346045ccab14e810121d5de4Glenn Kasten *pSolo = (mask >> track) & 1; 1450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten return SL_RESULT_SUCCESS; 1460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1480b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLMIDIMuteSoloItf_ IMIDIMuteSolo_Itf = { 1490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_SetChannelMute, 1500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_GetChannelMute, 1510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_SetChannelSolo, 1520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_GetChannelSolo, 1530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_GetTrackCount, 1540b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_SetTrackMute, 1550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_GetTrackMute, 1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_SetTrackSolo, 1570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo_GetTrackSolo 1580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 1590b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 1600b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IMIDIMuteSolo_init(void *self) 1610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 1620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 1630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mItf = &IMIDIMuteSolo_Itf; 1640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelMuteMask = 0; 1650b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mChannelSoloMask = 0; 1660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackMuteMask = 0; 1670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackSoloMask = 0; 168d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten // const 1690b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mTrackCount = 32; // FIXME 1700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 171