IMuteSolo.c revision c9a59d2a184ac461f46c3d878c6fc2574f1805f0
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/*
261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License.
661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at
761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten *
1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and
1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License.
1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */
1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* MuteSolo implementation */
1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h"
2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
22daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_SetChannelMute(SLMuteSoloItf self, SLuint8 chan, SLboolean mute)
2361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
26bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMuteSolo *thiz = (IMuteSolo *) self;
27bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IObject *thisObject = thiz->mThis;
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (SL_OBJECTID_AUDIOPLAYER != IObjectToObjectID(thisObject)) {
29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_FEATURE_UNSUPPORTED;
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        CAudioPlayer *ap = (CAudioPlayer *) thisObject;
32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
33f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        SLuint8 numChannels = ap->mNumChannels;
34f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        if (1 >= numChannels) {
35bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive(thiz);
36f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
37f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        } else if (numChannels <= chan) {
38bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive(thiz);
39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint8 mask = 1 << chan;
42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint8 oldMuteMask = ap->mMuteMask;
43f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            if (mute) {
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ap->mMuteMask |= mask;
45f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            } else {
46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ap->mMuteMask &= ~mask;
47f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            }
48bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive_attributes(thiz, oldMuteMask != ap->mMuteMask ? ATTR_GAIN :
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ATTR_NONE);
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
5561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
5661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
58daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetChannelMute(SLMuteSoloItf self, SLuint8 chan, SLboolean *pMute)
5961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pMute) {
63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
65bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMuteSolo *thiz = (IMuteSolo *) self;
66bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IObject *thisObject = thiz->mThis;
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (SL_OBJECTID_AUDIOPLAYER != IObjectToObjectID(thisObject)) {
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            CAudioPlayer *ap = (CAudioPlayer *) thisObject;
71f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            SLboolean mute;
72bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_lock_shared(thiz);
73f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            SLuint8 numChannels = ap->mNumChannels;
74f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            if (1 >= numChannels) {
75f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                mute = SL_BOOLEAN_FALSE;
76f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                result = SL_RESULT_FEATURE_UNSUPPORTED;
77f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            } else if (numChannels <= chan) {
78f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                mute = SL_BOOLEAN_FALSE;
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_PARAMETER_INVALID;
80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            } else {
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                SLuint8 mask = ap->mMuteMask;
82f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                mute = (SLboolean) ((mask >> chan) & 1);
83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_SUCCESS;
84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_shared(thiz);
86f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            *pMute = mute;
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
9161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
9261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
94daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_SetChannelSolo(SLMuteSoloItf self, SLuint8 chan, SLboolean solo)
9561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
98bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMuteSolo *thiz = (IMuteSolo *) self;
99bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IObject *thisObject = thiz->mThis;
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (SL_OBJECTID_AUDIOPLAYER != IObjectToObjectID(thisObject)) {
101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_FEATURE_UNSUPPORTED;
102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        CAudioPlayer *ap = (CAudioPlayer *) thisObject;
104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
105f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        SLuint8 numChannels = ap->mNumChannels;
106f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        if (1 >= numChannels) {
107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive(thiz);
108f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
109f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        } else if (numChannels <= chan) {
110bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive(thiz);
111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_PARAMETER_INVALID;
112f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten        } else {
113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint8 mask = 1 << chan;
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            SLuint8 oldSoloMask = ap->mSoloMask;
115f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            if (solo) {
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ap->mSoloMask |= mask;
117f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            } else {
118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ap->mSoloMask &= ~mask;
119f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            }
120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_exclusive_attributes(thiz, oldSoloMask != ap->mSoloMask ? ATTR_GAIN :
121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                ATTR_NONE);
122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_SUCCESS;
123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
12761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
130daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetChannelSolo(SLMuteSoloItf self, SLuint8 chan, SLboolean *pSolo)
13161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pSolo) {
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMuteSolo *thiz = (IMuteSolo *) self;
138bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IObject *thisObject = thiz->mThis;
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (SL_OBJECTID_AUDIOPLAYER != IObjectToObjectID(thisObject)) {
140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            CAudioPlayer *ap = (CAudioPlayer *) thisObject;
143f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            SLboolean solo;
144bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_lock_shared(thiz);
145f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            SLuint8 numChannels = ap->mNumChannels;
146f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            if (1 >= numChannels) {
147f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                solo = SL_BOOLEAN_FALSE;
148f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                result = SL_RESULT_FEATURE_UNSUPPORTED;
149f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            } else if (numChannels <= chan) {
150f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                solo = SL_BOOLEAN_FALSE;
151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_PARAMETER_INVALID;
152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            } else {
153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                SLuint8 mask = ap->mSoloMask;
154f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten                solo = (SLboolean) ((mask >> chan) & 1);
155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                result = SL_RESULT_SUCCESS;
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
157bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            interface_unlock_shared(thiz);
158f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            *pSolo = solo;
159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
16361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
16461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
166daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IMuteSolo_GetNumChannels(SLMuteSoloItf self, SLuint8 *pNumChannels)
16761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pNumChannels) {
171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IMuteSolo *thiz = (IMuteSolo *) self;
174bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IObject *thisObject = thiz->mThis;
175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (SL_OBJECTID_AUDIOPLAYER != IObjectToObjectID(thisObject)) {
176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            result = SL_RESULT_FEATURE_UNSUPPORTED;
177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        } else {
178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            CAudioPlayer *ap = (CAudioPlayer *) thisObject;
179f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            object_lock_shared(thisObject);
180f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            SLuint8 numChannels = ap->mNumChannels;
181f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            object_unlock_shared(thisObject);
182f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten            *pNumChannels = numChannels;
183c9a59d2a184ac461f46c3d878c6fc2574f1805f0Glenn Kasten            // spec errata says to return 0 (== UNKNOWN_NUMCHANNELS) if channel count is unknown
184c9a59d2a184ac461f46c3d878c6fc2574f1805f0Glenn Kasten            result = SL_RESULT_SUCCESS;
185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
19061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
19261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLMuteSoloItf_ IMuteSolo_Itf = {
19361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IMuteSolo_SetChannelMute,
19461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IMuteSolo_GetChannelMute,
19561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IMuteSolo_SetChannelSolo,
19661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IMuteSolo_GetChannelSolo,
19761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    IMuteSolo_GetNumChannels
19861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
19961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
20061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IMuteSolo_init(void *self)
20161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{
202bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IMuteSolo *thiz = (IMuteSolo *) self;
203bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IMuteSolo_Itf;
20461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}
205