IMIDIMuteSolo.c revision e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17/* MIDIMuteSolo implementation */ 18 19#include "sles_allinclusive.h" 20 21static SLresult IMIDIMuteSolo_SetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, 22 SLboolean mute) 23{ 24 if (channel > 15) 25 return SL_RESULT_PARAMETER_INVALID; 26 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 27 SLuint16 mask = 1 << channel; 28 interface_lock_exclusive(this); 29 if (mute) 30 this->mChannelMuteMask |= mask; 31 else 32 this->mChannelMuteMask &= ~mask; 33 interface_unlock_exclusive(this); 34 return SL_RESULT_SUCCESS; 35} 36 37static SLresult IMIDIMuteSolo_GetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, 38 SLboolean *pMute) 39{ 40 if (channel > 15 || (NULL == pMute)) 41 return SL_RESULT_PARAMETER_INVALID; 42 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 43 interface_lock_peek(this); 44 SLuint16 mask = this->mChannelMuteMask; 45 interface_unlock_peek(this); 46 *pMute = (mask >> channel) & 1; 47 return SL_RESULT_SUCCESS; 48} 49 50static SLresult IMIDIMuteSolo_SetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, 51 SLboolean solo) 52{ 53 if (channel > 15) 54 return SL_RESULT_PARAMETER_INVALID; 55 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 56 SLuint16 mask = 1 << channel; 57 interface_lock_exclusive(this); 58 if (solo) 59 this->mChannelSoloMask |= mask; 60 else 61 this->mChannelSoloMask &= ~mask; 62 interface_unlock_exclusive(this); 63 return SL_RESULT_SUCCESS; 64} 65 66static SLresult IMIDIMuteSolo_GetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, 67 SLboolean *pSolo) 68{ 69 if (channel > 15 || (NULL == pSolo)) 70 return SL_RESULT_PARAMETER_INVALID; 71 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 72 interface_lock_peek(this); 73 SLuint16 mask = this->mChannelSoloMask; 74 interface_unlock_peek(this); 75 *pSolo = (mask >> channel) & 1; 76 return SL_RESULT_SUCCESS; 77} 78 79static SLresult IMIDIMuteSolo_GetTrackCount(SLMIDIMuteSoloItf self, SLuint16 *pCount) 80{ 81 if (NULL == pCount) 82 return SL_RESULT_PARAMETER_INVALID; 83 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 84 // const, so no lock needed 85 SLuint16 trackCount = this->mTrackCount; 86 *pCount = trackCount; 87 return SL_RESULT_SUCCESS; 88} 89 90static SLresult IMIDIMuteSolo_SetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean mute) 91{ 92 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 93 // const 94 if (!(track < this->mTrackCount)) 95 return SL_RESULT_PARAMETER_INVALID; 96 SLuint32 mask = 1 << track; 97 interface_lock_exclusive(this); 98 if (mute) 99 this->mTrackMuteMask |= mask; 100 else 101 this->mTrackMuteMask &= ~mask; 102 interface_unlock_exclusive(this); 103 return SL_RESULT_SUCCESS; 104} 105 106static SLresult IMIDIMuteSolo_GetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pMute) 107{ 108 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 109 // const, no lock needed 110 if (!(track < this->mTrackCount) || NULL == pMute) 111 return SL_RESULT_PARAMETER_INVALID; 112 interface_lock_peek(this); 113 SLuint32 mask = this->mTrackMuteMask; 114 interface_unlock_peek(this); 115 *pMute = (mask >> track) & 1; 116 return SL_RESULT_SUCCESS; 117} 118 119static SLresult IMIDIMuteSolo_SetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean solo) 120{ 121 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 122 // const 123 if (!(track < this->mTrackCount)) 124 return SL_RESULT_PARAMETER_INVALID; 125 SLuint32 mask = 1 << track; 126 interface_lock_exclusive(this); 127 if (solo) 128 this->mTrackSoloMask |= mask; 129 else 130 this->mTrackSoloMask &= ~mask; 131 interface_unlock_exclusive(this); 132 return SL_RESULT_SUCCESS; 133} 134 135static SLresult IMIDIMuteSolo_GetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pSolo) 136{ 137 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 138 // const, no lock needed 139 if (!(track < this->mTrackCount) || NULL == pSolo) 140 return SL_RESULT_PARAMETER_INVALID; 141 interface_lock_peek(this); 142 SLuint32 mask = this->mTrackSoloMask; 143 interface_unlock_peek(this); 144 *pSolo = (mask >> track) & 1; 145 return SL_RESULT_SUCCESS; 146} 147 148static const struct SLMIDIMuteSoloItf_ IMIDIMuteSolo_Itf = { 149 IMIDIMuteSolo_SetChannelMute, 150 IMIDIMuteSolo_GetChannelMute, 151 IMIDIMuteSolo_SetChannelSolo, 152 IMIDIMuteSolo_GetChannelSolo, 153 IMIDIMuteSolo_GetTrackCount, 154 IMIDIMuteSolo_SetTrackMute, 155 IMIDIMuteSolo_GetTrackMute, 156 IMIDIMuteSolo_SetTrackSolo, 157 IMIDIMuteSolo_GetTrackSolo 158}; 159 160void IMIDIMuteSolo_init(void *self) 161{ 162 IMIDIMuteSolo *this = (IMIDIMuteSolo *) self; 163 this->mItf = &IMIDIMuteSolo_Itf; 164 this->mChannelMuteMask = 0; 165 this->mChannelSoloMask = 0; 166 this->mTrackMuteMask = 0; 167 this->mTrackSoloMask = 0; 168 // const 169 this->mTrackCount = 32; // FIXME 170} 171