| /* | |
| * Copyright (C) 2010 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| /* MIDIMuteSolo implementation */ | |
| #include "sles_allinclusive.h" | |
| static SLresult IMIDIMuteSolo_SetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, | |
| SLboolean mute) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (channel > 15) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| SLuint16 mask = 1 << channel; | |
| interface_lock_exclusive(thiz); | |
| if (mute) | |
| thiz->mChannelMuteMask |= mask; | |
| else | |
| thiz->mChannelMuteMask &= ~mask; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_GetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel, | |
| SLboolean *pMute) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (channel > 15 || (NULL == pMute)) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| interface_lock_peek(thiz); | |
| SLuint16 mask = thiz->mChannelMuteMask; | |
| interface_unlock_peek(thiz); | |
| *pMute = (mask >> channel) & 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_SetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, | |
| SLboolean solo) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (channel > 15) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| SLuint16 mask = 1 << channel; | |
| interface_lock_exclusive(thiz); | |
| if (solo) | |
| thiz->mChannelSoloMask |= mask; | |
| else | |
| thiz->mChannelSoloMask &= ~mask; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_GetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel, | |
| SLboolean *pSolo) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (channel > 15 || (NULL == pSolo)) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| interface_lock_peek(thiz); | |
| SLuint16 mask = thiz->mChannelSoloMask; | |
| interface_unlock_peek(thiz); | |
| *pSolo = (mask >> channel) & 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_GetTrackCount(SLMIDIMuteSoloItf self, SLuint16 *pCount) | |
| { | |
| SL_ENTER_INTERFACE | |
| if (NULL == pCount) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| // const, so no lock needed | |
| SLuint16 trackCount = thiz->mTrackCount; | |
| *pCount = trackCount; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_SetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean mute) | |
| { | |
| SL_ENTER_INTERFACE | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| // const | |
| if (!(track < thiz->mTrackCount)) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| SLuint32 mask = 1 << track; | |
| interface_lock_exclusive(thiz); | |
| if (mute) | |
| thiz->mTrackMuteMask |= mask; | |
| else | |
| thiz->mTrackMuteMask &= ~mask; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_GetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pMute) | |
| { | |
| SL_ENTER_INTERFACE | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| // const, no lock needed | |
| if (!(track < thiz->mTrackCount) || NULL == pMute) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| interface_lock_peek(thiz); | |
| SLuint32 mask = thiz->mTrackMuteMask; | |
| interface_unlock_peek(thiz); | |
| *pMute = (mask >> track) & 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_SetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean solo) | |
| { | |
| SL_ENTER_INTERFACE | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| // const | |
| if (!(track < thiz->mTrackCount)) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| SLuint32 mask = 1 << track; interface_lock_exclusive(thiz); | |
| if (solo) | |
| thiz->mTrackSoloMask |= mask; | |
| else | |
| thiz->mTrackSoloMask &= ~mask; | |
| interface_unlock_exclusive(thiz); | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static SLresult IMIDIMuteSolo_GetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pSolo) | |
| { | |
| SL_ENTER_INTERFACE | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| // const, no lock needed | |
| if (!(track < thiz->mTrackCount) || NULL == pSolo) { | |
| result = SL_RESULT_PARAMETER_INVALID; | |
| } else { | |
| interface_lock_peek(thiz); | |
| SLuint32 mask = thiz->mTrackSoloMask; | |
| interface_unlock_peek(thiz); | |
| *pSolo = (mask >> track) & 1; | |
| result = SL_RESULT_SUCCESS; | |
| } | |
| SL_LEAVE_INTERFACE | |
| } | |
| static const struct SLMIDIMuteSoloItf_ IMIDIMuteSolo_Itf = { | |
| IMIDIMuteSolo_SetChannelMute, | |
| IMIDIMuteSolo_GetChannelMute, | |
| IMIDIMuteSolo_SetChannelSolo, | |
| IMIDIMuteSolo_GetChannelSolo, | |
| IMIDIMuteSolo_GetTrackCount, | |
| IMIDIMuteSolo_SetTrackMute, | |
| IMIDIMuteSolo_GetTrackMute, | |
| IMIDIMuteSolo_SetTrackSolo, | |
| IMIDIMuteSolo_GetTrackSolo | |
| }; | |
| void IMIDIMuteSolo_init(void *self) | |
| { | |
| IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self; | |
| thiz->mItf = &IMIDIMuteSolo_Itf; | |
| thiz->mChannelMuteMask = 0; | |
| thiz->mChannelSoloMask = 0; | |
| thiz->mTrackMuteMask = 0; | |
| thiz->mTrackSoloMask = 0; | |
| // const | |
| thiz->mTrackCount = 32; // wrong | |
| } |