2010-02-01 15 views
12

प्रोग्राम के लिए प्लेबैक और रिकॉर्डिंग के लिए डिफ़ॉल्ट डिफ़ॉल्ट ऑडियो डिवाइस को कैसे बदलें?प्रोग्रामिक रूप से डिफ़ॉल्ट ध्वनि प्लेबैक डिवाइस को कैसे बदलें?

वहाँ खिड़की XP में ध्वनि प्रबंधक की तरह इसके लिए किसी भी रजिस्ट्री सेटिंग है?

कौन सा एपीआई यह करता है?

+0

पर आपका परीक्षण डिफ़ॉल्ट ध्वनि आउटपुट है? गैर-एमसीआई प्लेबैक के लिए भी? –

उत्तर

11

कोई सार्वजनिक एपीआई जो आप डिफ़ॉल्ट ऑडियो डिवाइस बदलने की अनुमति देता है, कि उस के तहत उन पर नियंत्रण माना जाता है कार्यक्षमता है। विंडोज़ में यह हमेशा मामला रहा है।

यह कहकर कि, यदि आप वेब पर खोज करते हैं, तो ऐसे कई लोग हैं जिन्होंने विंडोज विस्टा में ऐसा करने के लिए उपयोग किए गए एपीआई को रिवर्स किया है, लेकिन मैं आपको उनको इंगित नहीं कर रहा हूं (विपरीत इंजीनियर एपीआई आंतरिक असमर्थित एपीआई हैं और माइक्रोसॉफ्ट से नोटिस के बिना बदल सकते हैं)। आप इन समाधानों का उपयोग अपने जोखिम पर करते हैं।

+1

http://sdae.codeplex.com/ - मैंने इसका इस्तेमाल किया और यह काम किया। –

+0

मैंने उपरोक्त टिप्पणी में लिंक से कोड को # में परिवर्तित कर दिया और कुछ सामान जोड़े, आप इसे यहां भी पा सकते हैं: https://github.com/zivsha/SoundControl – ZivS

13

System Tray Audio Device Switcher"Software\Microsoft\Multimedia\Sound Mapper", "Playback" का उपयोग करता है ध्वनि डिवाइस जो गणन उपकरणों के द्वारा प्राप्त किया गया था के सूचकांक स्थापित करने के लिए। mciSendCommand से भी

प्रयोग किया जाता है "winmm.dll" इस source code में आप रजिस्ट्री कि प्राप्त करने के लिए इस्तेमाल किया चाबियाँ मिल जाएगा।

यदि यह काम नहीं करता है आप Process Monitor आजमाइए और जब आप डिफ़ॉल्ट डिवाइस बदल खिड़कियों के सभी रजिस्ट्री गतिविधियों की निगरानी कर सकता है। मेरी Vista स्थापना पर नियंत्रण कक्ष "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\"

साथ twiddles Vista के लिए http://www.vistaaudiochanger.com/

5

देखें कि क्या किसी को अब भी इस की जरूरत है मैं वास्तव में नहीं पता है, लेकिन यहाँ मेरे समाधान है। वास्तव में, यह कैप्चर डिवाइस के लिए है, लेकिन इसे आसानी से रेंडर डिवाइस में बदला जा सकता है।

यह वर्तमान समय के लिए डिवाइस के कुंजी में 3 रजिस्ट्री मान सेट करता है। जादू, लेकिन इस तरह यह काम करता है। नोट: केवल Win7 x64

void SetDefaultRecordDevice(tstring strDeviceName){ 
    const int BUFF_LEN = 260; 
    //HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Capture\{79434968-09f6-4dff-8086-c5e618b21473}\Role:0: 
    //"DE 07 08 00 06 00 10 00 15 00 38 00 1E 00 48 03" 
    HKEY hkCaptureDevices; 
    RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Capture") , 0, KEY_ENUMERATE_SUB_KEYS | KEY_WOW64_64KEY, &hkCaptureDevices); 
    TCHAR lpwstrDeviceGuidKey[BUFF_LEN]; 
    DWORD dwDeviceGuidKeySize = BUFF_LEN; 
    for(int i=0;RegEnumKeyEx(hkCaptureDevices, i, lpwstrDeviceGuidKey, &dwDeviceGuidKeySize, 0, 0, 0, 0) != ERROR_NO_MORE_ITEMS; ++i){ 
     dwDeviceGuidKeySize = BUFF_LEN; 
     HKEY hkProps; 
     RegOpenKeyEx(hkCaptureDevices, (tstring(lpwstrDeviceGuidKey) + _T("\\Properties")).c_str() , 0, KEY_READ | KEY_WOW64_64KEY, &hkProps); 
     TCHAR data[BUFF_LEN]; 
     DWORD dwDataSize = BUFF_LEN; 
     if(RegQueryValueEx(hkProps, _T("{a45c254e-df1c-4efd-8020-67d146a850e0},2"), 0, 0, (LPBYTE)data, &dwDataSize) != ERROR_SUCCESS){ 
      continue; 
     } else { 
      tstring strCurrentDeviceName(data); 
      // TODO név általánosítás 
      if(strDeviceName == strCurrentDeviceName){ 
       HKEY hkGuid; 
       RegOpenKeyEx(hkCaptureDevices, lpwstrDeviceGuidKey , 0, KEY_READ | KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_WOW64_64KEY | KEY_NOTIFY , &hkGuid); 

       time_t CurrentTime; 
       time(&CurrentTime); 

       time_t  now = time(0); 
       struct tm tstruct; 


       gmtime_s(&tstruct, &now); 
       // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime 
       // for more information about date/time format 

       char CustomRegistryDateValue[16]; 

       WORD year = tstruct.tm_year + 1900; 
       WORD month = tstruct.tm_mon+1; 
       WORD dayOfTheWeek = tstruct.tm_wday; 
       WORD day = tstruct.tm_mday; 
       WORD hour = tstruct.tm_hour; 
       WORD minute = tstruct.tm_min; 
       WORD second = tstruct.tm_sec; 
       WORD millisec = 0x0; // hasrautés 

       int k = 0; 
       *((WORD*)CustomRegistryDateValue + k++) = year; 
       *((WORD*)CustomRegistryDateValue + k++) = month; 
       *((WORD*)CustomRegistryDateValue + k++) = dayOfTheWeek; 
       *((WORD*)CustomRegistryDateValue + k++) = day; 
       *((WORD*)CustomRegistryDateValue + k++) = hour; 
       *((WORD*)CustomRegistryDateValue + k++) = minute; 
       *((WORD*)CustomRegistryDateValue + k++) = second; 
       *((WORD*)CustomRegistryDateValue + k++) = millisec; 

       RegSetValueExA(hkGuid, ("Role:0"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16); 
       RegSetValueExA(hkGuid, ("Role:1"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16); 
       RegSetValueExA(hkGuid, ("Role:2"), 0, REG_BINARY, (LPBYTE)CustomRegistryDateValue, 16); 
       RegFlushKey(hkGuid); 
       RegCloseKey(hkGuid); 
      } 
     } 
     RegCloseKey(hkProps); 
    } 
    RegCloseKey(hkCaptureDevices); 
} 
+0

बढ़िया! विंडोज 10 –

+0

में भी काम करना असल में यह काम नहीं करता है, कम से कम विंडोज 7/64 में नहीं। ध्वनि/रिकॉर्डिंग संवाद डिफ़ॉल्ट रिकॉर्डिंग डिवाइस में परिवर्तन दिखाता है (यदि आप इसे कम से कम पुनः लोड करते हैं), लेकिन (फिर से खोल दिया गया) WaveIn फ़ंक्शन अभी भी पुराने डिवाइस से अपना डेटा प्राप्त करते हैं। तो यह एक कॉस्मेटिक बदलाव प्रतीत होता है, आंतरिक रूप से चीजें अद्यतन नहीं होती हैं। मान लीजिए कि इसे और जादू की जरूरत है। –

संबंधित मुद्दे