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