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