android - ऑडियो में पुनर्निर्देशन/एंड्रॉइड में वैकल्पिक ध्वनि पथ बनाना



audio alsa (1)

क्या किसी को ऑडियो रीडायरेक्ट करने या एंड्रॉइड में नए साउंड पथ बनाने के साथ अनुभव (ओपनएसएल ईएस, एएलएसए, आदि का प्रयोग कर रहा है)? अंतिम लक्ष्य बाहरी माइक्रोफोन को बदलने के लिए एक आभासी माइक्रोफ़ोन बनाना है, जहां कोई ऑडियो फ़ाइलें खेल सकता है जैसे कि वे माइक्रोफ़ोन में बोल रहे थे। AudioSource.MIC साथ माइक्रोफ़ोन तक पहुंचने वाले AudioSource.MIC को इस वैकल्पिक स्ट्रीम का उपयोग करना चाहिए। यह आवाज कॉल के साथ काम करने के लिए आवश्यक नहीं है, मेरा मानना ​​है कि इस प्रकार की कार्यक्षमता प्राप्त करना कठिन है क्योंकि यह सब रेडियो में किया जाता है

कहाँ शुरू करने के लिए कोई विचार? मैंने ओपनएसएल और एएलएसए के साथ कुछ शोध किया है, लेकिन ऐसा लगता है कि कस्टम ऑडियो पथ को परिभाषित करने के लिए मुझे नया फर्मवेयर (रोम) पैकेज करना होगा। अगर इसे टाला जा सकता है मैं एक आवेदन-स्तरीय समाधान बनाना चाहता हूं। फोन 'जड़ें' (सु बिनियां हैं) इस के लिए लक्ष्य डिवाइस सैमसंग गैलेक्सी एस 4 गूगल संस्करण (जीटी- i9505G) है विशेष रूप से मैं ऑडियो ड्राइवर कॉन्फ़िगरेशन / स्रोत कोड या i9505G के लिए कोई भी संदर्भ ढूंढ रहा हूं

अग्रिम में धन्यवाद!

संपादित करें - मैंने साइयनोजेमोड 10.2 स्रोत पेड़ को चेक किया है, साथ में jfltexx ड्राइवरों और कर्नेल के साथ। यहां कर्नेल / सैमसंग / जेएफ / ध्वनि की सामग्री है: http://pastebin.com/7vK8THcZ क्या यह कहीं भी दस्तावेज है?


मैंने एक बार आप की कार्यक्षमता को क्वालकॉम के एपीक्यू 8064 प्लेटफॉर्म पर आधारित फोन पर लागू किया है (जो आपके लक्षित डिवाइस में से एक के समान लगभग समान प्लेटफॉर्म है)। नीचे इस बात का सार है कि मुझे इसके बारे में क्या याद किया जा सकता है, क्योंकि अब मेरे पास लिखे गए कोड तक पहुंच नहीं है, या ऐसा माहौल जहां मैं इन प्रकार के संशोधनों को आसानी से कर सकता हूं। इसलिए यदि यह उत्तर खंडित यादों की गड़बड़ी की तरह पढ़ता है, तो ऐसा इसलिए है क्योंकि यह वास्तव में क्या है।

यह जानकारी अन्य क्वालकॉम प्लेटफार्मों (जैसे एमएसएम 8960 या एमएसएम 8974) के लिए अधिक या कम भी लागू हो सकती है, लेकिन अन्य विक्रेताओं (एनवीडिया टेग्रा, सैमसंग एक्सिनोस, टीआई ओएमएपी, आदि) के प्लेटफॉर्म के लिए पूरी तरह से बेकार हो जाएगा।

एक संक्षिप्त नोट: मैं जिस पद्धति का इस्तेमाल करता हूं इसका अर्थ है कि जिस ऑडियो को रिकॉर्डिंग एप्लीकेशन प्राप्त हो, वह एंड्रॉइड मल्टीमीडिया फ़्रेमवर्क और / या प्लेटफ़ॉर्म के मल्टीमीडिया डीएसपी में मिक्सिंग / वॉल्यूम कंट्रोल के जरिए चलेगा। तो अगर आप 75% मात्रा में कुछ खेल रहे हैं, रिकॉर्डिंग कर रहे हैं, और फिर 75% मात्रा में रिकॉर्डिंग को वापस चलाते हुए यह बहुत शांत लग सकता है। यदि आप अप्रसारित पीसीएम डेटा (डिकोड करने के बाद, लेकिन मिक्सिंग / वॉल्यूम नियंत्रण से पहले) प्राप्त करना चाहते हैं, तो आपको किसी अन्य तरीके पर विचार करना होगा, जैसे कि AudioFlinger कस्टमाइज़ करना, लेकिन ऐसा कुछ ऐसा नहीं है जिस पर मैंने कोशिश की है या इसके बारे में जानकारी प्रदान कर सकते हैं।

ब्याज के कुछ स्थान:

मंच के ऑडियो ड्राइवर विशेष रूप से एमएसएम-पीसीएम- routing.c फ़ाइल

ALSA UCM (उपयोग-केस प्रबंधक) सेटिंग्स फ़ाइल । यह सिर्फ एक उदाहरण UCM सेटिंग्स फ़ाइल है इन फ़ाइलों के कई रूपों का इस्तेमाल सटीक प्लेटफॉर्म के आधार पर किया जाता है, इसलिए आपके पास थोड़ा अलग नाम हो सकता है (हालांकि यह snd_soc_msm_ साथ शुरू होना चाहिए ), और इसकी सामग्री संभवतः एक से लिंक की गई होगी
किटकैट के लिए नोट और बाद में: यूसीएम सेटिंग्स फाइल जेलीबीन (और संभवतः आईसीएस) पर इस्तेमाल की गई थी। मेरी समझ यह है कि ये सेटिंग्स mixer_paths.xml पर एक फ़ाइल नामक mixer_paths.xml पर स्थानांतरित कर mixer_paths.xml गई हैं। सामग्री बहुत ही समान हैं, बस एक अलग प्रारूप में।

ऑडियो एचएएल कोड ALSA UCM libalsa-intf में मौजूद है, और AudioHardware / AudioPolicyManager / ALSADevice कोड audio-alsa ALSADevice में मौजूद है। ध्यान दें कि यह कोड जेलीबीन के लिए है, क्योंकि यह नवीनतम संस्करण है जिसे मैं परिचित हूं। निर्देशिका संरचना (और संभवत: कुछ फ़ाइलें / वर्ग) किटकैट पर अलग है

यदि आप UCM सेटिंग्स फ़ाइल खोलते हैं और "HiFiPROXY Rx" खोज करते हैं तो आपको ऐसा कुछ मिलेगा:

SectionVerb
Name "HiFiPROXY Rx"

EnableSequence
    'AFE_PCM_RX Audio Mixer MultiMedia1':1:1
EndSequence

DisableSequence
    'AFE_PCM_RX Audio Mixer MultiMedia1':1:0
EndSequence

# ALSA PCMs
CapturePCM 0
PlaybackPCM 0
EndSection

यह एक क्रिया परिभाषित करता है (अनिवार्य रूप से एक ऑडियो उपयोग-केस का आधार; वहाँ भी संशोधक हैं जो नाम के प्लेबैक और रिकॉर्डिंग जैसे सामान के लिए क्रिया के शीर्ष पर लागू किया जा सकता है) नाम "HiFiPROXY Rx" ( "HiFiPROXY Rx" मॉनीकर सबसे अधिक के लिए उपयोग किया जाता है) गैर-वॉयस-कॉल वर्ब्स, PROXY इस्तेमाल ऑडियो डिवाइस को संदर्भित करता है, और Rx मतलब आउटपुट) और निर्दिष्ट करता है कि कौन से एएलएसए नियंत्रण (नों) को लिखना है, और उन्हें क्या लिखना है, जब उपयोग-केस सक्षम / अक्षम किया जाना चाहिए अंत में यह ALSA PCM प्लेबैक / कैप्चर डिवाइस को इस उपयोग-मामले में उपयोग करने के लिए सूचीबद्ध करता है। उदाहरण के लिए, PlaybackPCM 0 अर्थ है कि प्लेबैक डिवाइस 0 का इस्तेमाल किया जाना चाहिए (एएलएसए कार्ड एक ही है जो अंतर्निहित हार्डवेयर कोडेक का प्रतिनिधित्व करता है, जो आमतौर पर कार्ड है 0)। इन क्रियाओं का प्रयोग-केस (संगीत प्लेबैक, वॉयस कॉल, रिकॉर्डिंग, ...) के आधार पर ऑडियो एचएएल द्वारा चुना जाता है, जो आपके पास संलग्न सामान हैं आदि।

यदि आप msm_qdsp6_widgets तालिका में msm_qdsp6_widgets तालिका में "AFE_PCM_RX Audio Mixer" की खोज करते हैं तो आप देखेंगे कि यह afe_pcm_rx_mixer_controls नामक मिश्रक नियंत्रणों की सूची को संदर्भित करता है जो इस तरह दिखता है:

static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
    SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
    MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
    msm_routing_put_audio_mixer),
    SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
    ... and so on...

यह फ्रंट एंड डीएआई को सूचीबद्ध करता है कि आपको बैक एंड डीएआई ( AFE_PCM_RX ) से कनेक्ट होने की अनुमति है। ये कैसे एक दूसरे से संबंधित हैं, यह विचार प्राप्त करने के लिए, इन आरेखों को देखें
AFE_PCM_RX और AFE_PCM_TX , क्वालकॉम के कुछ प्लेटफार्मों पर AFE_PCM_TX की एक जोड़ी है जो एक प्रकार की डमी / प्रॉक्सी डिवाइस को लागू करता है। आप क्या करते हैं फ़ीड ऑडियो AFE_PCM_RX जिसके बाद मल्टीमीडिया डीएसपी (क्यूडीएसपी) द्वारा प्रोसेस किया जाता है, और फिर आप इसे AFE_PCM_TX माध्यम से वापस पढ़ सकते हैं। इसका उपयोग यूएसबी और वाईफाई ऑडियो रूटिंग को कार्यान्वित करने के लिए किया जाता है, और ए 2 डी पी आईआईआरसी भी।

AFE_PCM_RX Audio Mixer MultiMedia1 लाइन पर वापस: यह कहते हैं कि आप MultiMedia1 को AFE_PCM_RX Audio Mixer में खिला रहे हैं। MultiMedia1 1 सामान्य प्लेबैक / रिकॉर्डिंग के लिए उपयोग किया जाता है, और pcmC0D0 मेल खाती है (आप अपने फोन पर adb shell cat /proc/asound/devices साथ उपकरणों की सूची में सक्षम होना चाहिए)। MultiMedia3 और MultiMedia5 जैसी अन्य फ्रंट एंड डीएआई भी हैं, जो कि कम विलंबता प्लेबैक और कम पावर ऑडियो प्लेबैक जैसी विशेष मामलों में उपयोग किए जाते हैं।
जब आप MultiMedia1 को AFE_PCM_RX Audio Mixer फ़ीड करते हैं, तो आप कार्ड 0 पर प्लेबैक डिवाइस 0 लिखते हैं, जो AFE_PCM_RX बैक एंड डीएआई में खिलाया जाएगा। इसे वापस पढ़ने के लिए आप एक यूसीएम क्रिया की स्थापना कर सकते हैं जो 'MultiMedia1 Mixer AFE_PCM_TX':1:1 तरह कुछ करता है 'MultiMedia1 Mixer AFE_PCM_TX':1:1 , और फिर आप pcmC0D0c (जो कि डिफ़ॉल्ट pcmC0D0c कैप्चर डिवाइस होना चाहिए) से पढ़ा होगा।

एक साधारण परीक्षण आपके फोन से यूसीएम सेटिंग्स फाइल को खींचने के लिए होगा (कहीं /system/etc/ अंतर्गत स्थित होना चाहिए) और "HiFi" EnableSequence "HiFi" क्रिया की EnableSequence तरह कुछ के साथ में EnableSequence करना होगा:

'AFE_PCM_RX Audio Mixer MultiMedia1':1:1
'AFE_PCM_RX Audio Mixer MultiMedia3':1:1
'AFE_PCM_RX Audio Mixer MultiMedia5':1:1

(और इसी तरह DisableSequence , लेकिन प्रत्येक पंक्ति के अंत में :1:0 )।

फिर "Capture Music" संशोधक (सामान्य रिकॉर्डिंग के लिए यह खराब नामित संशोधक है) पर जाएं और SLIM_0_TX को AFE_PCM_TX

अपनी संशोधित UCM सेटिंग फ़ाइल को फोन पर वापस कॉपी करें (रूट अनुमति की आवश्यकता है), और फ़ोन को रिबूट करें। फिर कुछ प्लेबैक शुरू करें (एक वायर्ड हेडसेट / हेडफोन संलग्न है, और टच आवाज़ को अक्षम करें ताकि कम विलंबता क्रिया का चयन न किया जाए), और ऑडियो AudioSource.MIC से रिकॉर्डिंग प्रारंभ करें। AudioSource.MIC बाद में, रिकॉर्डिंग की जांच करें और देखें कि क्या आप प्लेबैक ऑडियो रिकॉर्ड करने में सक्षम थे। यदि नहीं, तो शायद कम पावर ऑडियो क्रिया का चयन किया गया था और आपको "HiFi Low Power" क्रिया को इसी तरह संशोधित करना होगा, जैसा कि आप "HiFi" क्रिया के साथ किया था। यह आपकी मदद करेगा अगर आपके पास सभी #define LOG_NDEBUG 0 फाइलों में ऑडियो डिबग प्रिंट्स सक्षम हैं (यानी सभी सीपीपी फाइलों में #define LOG_NDEBUG 0 करें, जहां आप इसे पा सकते हैं) ताकि आप देख सकें कि कौन सी यूसीएम क्रियाएं / संशोधक जो चयनित हैं

ऊपर दिए गए संशोधन को थोड़ा सा कठिन हो जाता है क्योंकि आपको सभी MultiMedia फ्रंट एंड डीएआई को सभी प्रासंगिक क्रियाओं और संशोधकों के लिए कवर करना पड़ता है।
आईआईआरसी, मैं इस क्रिया को प्रति क्रिया / संशोधक के लिए एक पंक्ति में सरल बनाने में सक्षम था:

'AFE_PCM_RX Port Mixer SLIM_0_RX':1:1

यदि आप "HiFi Lowlatency" ", "HiFi Lowlatency" "HiFi Low Power ", "HiFi Lowlatency" क्रियाओं को देखते हैं तो आप देखेंगे कि वे सभी SLIMBUS_0_RX बैक एंड डीएआई का उपयोग करते हैं, इसलिए मैं इसका लाभ AFE_PCM_RX Port Mixer का उपयोग करके करता AFE_PCM_RX Port Mixer जो देता है मुझे पीछे की ओर से एक डीएआई से दूसरी पीठ के पीछे डीएआई का कनेक्शन स्थापित किया गया। यदि आप afe_pcm_rx_port_mixer_controls और msm-pcm-routing.c में afe_pcm_rx_port_mixer_controls तालिकाओं को देखते हैं तो आप देखेंगे कि AFE_PCM_RX Port Mixer लिए कोई SLIM_0_RX प्रविष्टि नहीं है, इसलिए आपको उन लोगों को जोड़ना होगा (यह केवल कॉपी-चिपकाने का मामला है मौजूदा लाइनों और नाम बदलते हुए)।

आप में से कुछ अन्य बदलाव करना होगा:

  • चौखटे / आधार और चौखटे / ए.वी. (जैसे AudioManager , AudioService , AudioSystem ) में आपको एक नया AudioSource निरंतर जोड़ना होगा और सुनिश्चित कर लें कि यह सभी आवश्यक स्थानों में पहचाना जाएगा

  • यूसीएम सेटिंग्स फ़ाइल में आपको AudioSource नियंत्रण को ठीक से सेट करने के लिए कुछ नया क्रिया / संशोधक जोड़ना होगा, जब आपका नया AudioSource उपयोग किया जाता है

  • ऑडियो एचएएल में आपको कुछ बदलाव करना पड़ सकते हैं ताकि आपके नए AudioSource का प्रयोग किया AudioSource , जब आपके नए वर्ब / संशोधक का चयन किया जाए। ध्यान दें कि AudioPolicyManagerALSA नामक AudioPolicyManagerBase का आधार क्लास है, जिसे आप को भी संशोधित करना पड़ सकता है (यह स्रोत पेड़ में कहीं और स्थित है )।





opensl