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