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
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
22e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IMIDIMuteSolo_SetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel,
23e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean mute)
240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (channel > 15) {
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint16 mask = 1 << channel;
32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (mute)
34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mChannelMuteMask |= mask;
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mChannelMuteMask &= ~mask;
37bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
430b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
450b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetChannelMute(SLMIDIMuteSoloItf self, SLuint8 channel,
460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLboolean *pMute)
470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (channel > 15 || (NULL == pMute)) {
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
54bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint16 mask = thiz->mChannelMuteMask;
56bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMute = (mask >> channel) & 1;
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
630b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
65e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IMIDIMuteSolo_SetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel,
66e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten    SLboolean solo)
670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (channel > 15) {
71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
73bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint16 mask = 1 << channel;
75bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (solo)
77bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mChannelSoloMask |= mask;
78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mChannelSoloMask &= ~mask;
80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
860b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
880b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetChannelSolo(SLMIDIMuteSoloItf self, SLuint8 channel,
890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    SLboolean *pSolo)
900b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (channel > 15 || (NULL == pSolo)) {
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
96bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
97bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
98bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint16 mask = thiz->mChannelSoloMask;
99bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pSolo = (mask >> channel) & 1;
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
1050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
1060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1080b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackCount(SLMIDIMuteSoloItf self, SLuint16 *pCount)
1090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pCount) {
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
115bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        // const, so no lock needed
117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint16 trackCount = thiz->mTrackCount;
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pCount = trackCount;
119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
1230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
1240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1260b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_SetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean mute)
1270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
130bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
131d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
132bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!(track < thiz->mTrackCount)) {
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLuint32 mask = 1 << track;
136bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (mute)
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mTrackMuteMask |= mask;
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mTrackMuteMask &= ~mask;
141bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
1460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
1470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1490b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackMute(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pMute)
1500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
154d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const, no lock needed
155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!(track < thiz->mTrackCount) || NULL == pMute) {
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
158bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
159bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 mask = thiz->mTrackMuteMask;
160bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pMute = (mask >> track) & 1;
162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
164ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
1660b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
1670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1690b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_SetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean solo)
1700b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
174d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
175bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!(track < thiz->mTrackCount)) {
176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
178bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 mask = 1 << track; interface_lock_exclusive(thiz);
179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (solo)
180bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mTrackSoloMask |= mask;
181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
182bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            thiz->mTrackSoloMask &= ~mask;
183bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
1880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
1890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1910b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IMIDIMuteSolo_GetTrackSolo(SLMIDIMuteSoloItf self, SLuint16 track, SLboolean *pSolo)
1920b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
193ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
194ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
195bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
196d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const, no lock needed
197bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    if (!(track < thiz->mTrackCount) || NULL == pSolo) {
198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
200bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_peek(thiz);
201bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        SLuint32 mask = thiz->mTrackSoloMask;
202bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_peek(thiz);
203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        *pSolo = (mask >> track) & 1;
204ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
205ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
206ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
207ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
2080b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
2090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
210ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
2110b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLMIDIMuteSoloItf_ IMIDIMuteSolo_Itf = {
2120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_SetChannelMute,
2130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_GetChannelMute,
2140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_SetChannelSolo,
2150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_GetChannelSolo,
2160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_GetTrackCount,
2170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_SetTrackMute,
2180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_GetTrackMute,
2190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_SetTrackSolo,
2200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten    IMIDIMuteSolo_GetTrackSolo
2210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten};
2220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten
2230b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IMIDIMuteSolo_init(void *self)
2240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{
225bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMIDIMuteSolo *thiz = (IMIDIMuteSolo *) self;
226bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IMIDIMuteSolo_Itf;
227bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mChannelMuteMask = 0;
228bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mChannelSoloMask = 0;
229bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mTrackMuteMask = 0;
230bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mTrackSoloMask = 0;
231d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten    // const
232bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mTrackCount = 32; // wrong
2330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}
234