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