an00b पर विस्तार से बता दें: उपरोक्त रों जवाब और सवाल हम स्रोत कोड में बेहतर जानकारी के लिए है का संपादित संस्करण। IAudioflinger AudioFlinger सेवा करने के लिए इंटरफ़ेस और
करने के लिए कॉल
virtual status_t setMicMute(bool state)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
data.writeInt32(state);
remote()->transact(SET_MIC_MUTE, data, &reply);
return reply.readInt32();
}
वास्तव में माइक्रोफ़ोन म्यूट करने के बाइंडर लेन-देन है। बाइंडर कॉल की प्राप्ति की ओर दिखाई देता है:
status_t BnAudioFlinger::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
...
case SET_MIC_MUTE: {
CHECK_INTERFACE(IAudioFlinger, data, reply);
int state = data.readInt32();
reply->writeInt32(setMicMute(state));
return NO_ERROR;
} break;
...
}}
और AudioFlinger में setMicMute के वास्तविक क्रियान्वयन के लिए कहता है। अगला चरण इस फ़ंक्शन को देखना है:
status_t AudioFlinger::setMicMute(bool state)
{
// check calling permissions
if (!settingsAllowed()) {
return PERMISSION_DENIED;
}
AutoMutex lock(mHardwareLock);
mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
status_t ret = mAudioHardware->setMicMute(state);
mHardwareStatus = AUDIO_HW_IDLE;
return ret;
}
यहां हम दो चीजें नोट कर सकते हैं। पहला यह है कि माइक्रोफ़ोन को म्यूट करने में सक्षम होने की अनुमति है। सेटिंग्स में अनुमति की अनुमति दी गई है एंड्रॉइड.permission.MODIFY_AUDIO_SETTINGS जैसा कि माइक्रोफ़ोन को म्यूट करने के लिए पहली आवश्यकता के ऊपर टिप्पणियों में से एक में उल्लिखित है, यह है कि आपके एप्लिकेशन ने घोषणा की है कि उसे इस अनुमति की आवश्यकता है। अगली बात यह है कि अब हम mAudioHardware-> setMicMute (राज्य) का उपयोग कर setMicMute के हार्डवेयर विशिष्ट संस्करण में कॉल करते हैं।
हार्डवेयर प्लग करने के तरीके के बारे में अधिक जानकारी के लिए फ़ाइल AudioHardwareInterface.cpp का अध्ययन करें। असल में यह एक बाहरी सी कॉल के साथ एक libhardware में समाप्त होता है ताकि ऑडियोियोर्डवेयर बनाया जा सके जो मंच के लिए सही ऑडियोहार्डवेयर में प्लग करता है। ए 2 डीडी आधारित हार्डवेयर का उपयोग करने के लिए स्विच भी हैं, जो एमुलेटर के लिए एक सामान्य है और ऑडियो को दबा रहा है। माना जाता है कि आप एक वास्तविक डिवाइस पर काम कर रहे हैं, कार्यान्वयन तब बहुत अधिक हार्डवेयर निर्भर करता है। इसके लिए एक महसूस करने के लिए हम उदाहरण के रूप में क्रेस्पो (नेक्सस एस) से उपलब्ध ऑडियोहार्डवेयर का उपयोग कर सकते हैं।
status_t AudioHardware::setMicMute(bool state)
{
LOGV("setMicMute(%d) mMicMute %d", state, mMicMute);
sp<AudioStreamInALSA> spIn;
{
AutoMutex lock(mLock);
if (mMicMute != state) {
mMicMute = state;
// in call mute is handled by RIL
if (mMode != AudioSystem::MODE_IN_CALL) {
spIn = getActiveInput_l();
}
}
}
if (spIn != 0) {
spIn->standby();
}
return NO_ERROR;
}
इस उदाहरण के आधार पर हम स्मार्टफोन में ऑडियो रूटिंग के कार्यान्वयन की चर्चा के साथ लपेट सकते हैं। जैसा कि आप क्रेस्पो कार्यान्वयन में देख सकते हैं, यदि आप कॉल में नहीं हैं तो माइक म्यूट कॉल का सम्मान किया जाएगा। इसका कारण यह है कि ऑडियो एनालॉग बेसबैंड के माध्यम से गुजरता है जो बिजली विनियमन, प्रवर्धन और अन्य चीजों को संभालता है। जब कॉल में वॉयस ऑडियो अक्सर एनालॉग बेसबैंड और मॉडेम सीपीयू द्वारा एक साथ संभाला जाता है और एप्लिकेशन सीपीयू के माध्यम से नहीं भेजा जाता है। माइक्रोफोन को म्यूट करने के लिए उस स्थिति में आपको आरआईएल के माध्यम से मॉडेम सीपीयू के माध्यम से जाना पड़ सकता है। लेकिन चूंकि यह व्यवहार हार्डवेयर निर्भर है, इसलिए कोई सामान्य समाधान नहीं है।
अपने 4 अतिरिक्त प्रश्न करने के लिए लघु संस्करण देने के लिए:
झंडा कोड की कई परतों के माध्यम से पारित हो जाता है जब तक यह हार्डवेयर विशिष्ट मूक माइक्रोफोन में समाप्त होता है।
जब हार्डवेयर विशिष्ट कोड कम से कम कुछ उपकरणों पर कॉल में छोड़कर हार्डवेयर विशिष्ट कोड चलाया जाता है तो माइक्रो डिस्कनेक्ट हो जाता है।
जब सेटमिक्रोपोन म्यूट माइक को म्यूट नहीं करता है, यानी जब कॉल में टेलीफ़ोनी एपीआई का उपयोग करके ऐसा करना संभव हो सकता है, तो मैं फोन ऐप का अध्ययन करने का सुझाव दूंगा।
वर्तमान कार्यान्वयन म्यूट के आधार पर कॉल में नहीं होने पर काम करना प्रतीत होता है लेकिन प्लेटफॉर्म पर हार्डवेयर विशिष्ट समस्याएं हो सकती हैं जिन पर हमने अध्ययन नहीं किया है।
संपादित करें:
कुछ और खुदाई और जिस तरह मॉडेम सीपीयू के लिए एक मूक आदेश भेजने के लिए आंतरिक फोन इंटरफेस है कि com.android.internal.telephony पैकेज का हिस्सा है के माध्यम से है क्या यह एसडीके डेवलपर्स के लिए उपलब्ध नहीं है। टिप्पणी के आधार पर आपने देखा कि यह फ़ंक्शन केवल उन अनुप्रयोगों द्वारा उपयोग किया जाना चाहिए जो ऑडियो प्रबंधन या मूल टेलीफ़ोनी एप्लिकेशन को प्रतिस्थापित करते हैं, मुझे लगता है कि AudioManager.setMicrophoneMute() को हमेशा माइक्रोफ़ोन को म्यूट करना था। लेकिन चूंकि अन्य अनुप्रयोगों ने शायद इसका उपयोग किया है, इसलिए उन्होंने हार्डवेयर कार्यान्वयन में एक चेक जोड़ा है ताकि फोन एप्लिकेशन की स्थिति को गड़बड़ न किया जा सके जो म्यूट कनेक्शन के साथ-साथ माइक्रोफोन का ट्रैक रखता है। यह कार्य शायद हार्डवेयर कार्यान्वयन के विवरणों के कारण अभी तक काम नहीं कर रहा है और तथ्य यह है कि म्यूट एक अधिक जटिल ऑपरेशन है, जो शुरुआत में कॉल राज्यों पर विचार करते समय सोचता है।
मुझे यकीन है कि आप होना चाहिए हूँ - लेकिन आप 'checkAudioSettingsPermission' द्वारा परीक्षण अनुमतियाँ सक्षम था? – YetAnotherUser
@YetAnotherUser मैंने [checkAudioSettingsPermission] के लिए "प्रलेखन" की जांच की है (http://www.androidjavadoc.com/1.0_r1_src/android/media/AudioService.html#checkAudioSettingsPermission%28java.lang.String%29) और लौटने के अलावा बूलियन, स्ट्रिंग पैरामीटर में यह क्या करता है और यह क्या अपेक्षा करता है इसके बारे में कोई संकेत नहीं है। मैं वास्तव में 'setMicrophoneMute() 'से' checkAudioSettingsPermission' 'से प्रश्न नहीं बदलना चाहता हूं, लेकिन क्या आपको कोई विचार है कि' checkAudioSettingsPermission' क्या करता है और उस 'स्ट्रिंग' पैरामीटर का अर्थ क्या है? +1 – ateiob
आप शुरुआत में जो हासिल करना चाहते हैं उसे रेखांकित करना चाहते हैं। ऐसा लगता है जैसे आप थोड़ा सा कोर्स प्राप्त कर चुके हैं। आप शायद टेलीफ़ोनी-एप्लिकेशंस को प्रतिस्थापित नहीं करना चाहते हैं और न ही आपको (और आप प्लेटफार्म प्रमाण के बिना रास्ते से नहीं कर सकते)। – marsbear