2010-06-11 13 views
7

सबसे पहले, ध्यान दें कि मुझे पता है कि पहले से ही इस तरह के कुछ प्रश्न हैं; हालांकि वे पर्याप्त समस्या को हल करने के लिए प्रतीत नहीं होते हैं। मेरे पास एक सी # एप्लिकेशन है, सभी पिनवोक हुक के साथ waveXXX एपीआई से बात करने के लिए, और मैं कैप्चर करने और ऑडियो के साथ वापस खेलने में सक्षम हूं। मैं उस एपीआई के साथ स्पीकर (वेवऑट) वॉल्यूम समायोजित करने में भी सक्षम हूं।
समस्या यह है कि किसी भी कारण से, एपीआई मुझे माइक्रोफोन (वेवइन) वॉल्यूम समायोजित करने की अनुमति नहीं देता है। इसलिए, मैंने कुछ मिक्सर कोड ढूंढने में कामयाब रहा जो मैंने P12voke के माध्यम से और तक पहुंच लिया है और यह मुझे माइक्रोफ़ोन वॉल्यूम समायोजित करने की अनुमति देता है, लेकिन केवल मेरे W7 पीसी पर। मेरे साथ शुरू किया गया मिक्सर कोड यहां से आता है: http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85 और यह काम करता है, लेकिन स्पीकर वॉल्यूम समायोजित करने के लिए लिखा जाता है। मैं SetMicVolume विधि यहाँ दिखाया गया है ...सी # से माइक्रोफोन लाभ को समायोजित करने के लिए कैसे करें (XP और W7 पर काम करने की आवश्यकता है)

public static void SetMicVolume(int mxid, int percentage) 
    { 
     bool rc; 
     int mixer, vVolume; 
     MIXERCONTROL volCtrl = new MIXERCONTROL(); 
     int currentVol; 
     mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN); 
     int type = MIXERCONTROL_CONTROLTYPE_VOLUME; 
     rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol); 
     if (rc == false) 
     { 
      mixerClose(mixer); 
      mixerOpen(out mixer, 0, 0, 0, 0); 
      rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol); 
      if (rc == false)  
       throw new Exception("SetMicVolume/GetVolumeControl() failed"); 
     } 
     vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum)/100.0F) * percentage); 
     rc = SetVolumeControl(mixer, volCtrl, vVolume); 
     if (rc == false) 
      throw new Exception("SetMicVolume/SetVolumeControl() failed"); 
     mixerClose(mixer); 
    } 

नोट "दूसरा प्रयास" GetVolumeControl कॉल करने के लिए() जोड़ा गया। ऐसा इसलिए किया जाता है क्योंकि एक्सपी पर, GetVolumeControl (उस कोड के लिए उपरोक्त साइट का संदर्भ लें) में पहली कॉल में, मिक्सर GetLineControlsA() को कॉल MIXERR_INVALCONTROL लौटने वाले XP सिस्टम के साथ विफल रहता है। फिर, mixerOpen (आउट मिक्सर, 0, 0, 0, 0) का उपयोग करके इस दूसरे प्रयास के साथ, कोड विफलता वापस नहीं करता है लेकिन माइक लाभ अप्रभावित है। नोट, जैसा कि मैंने उपरोक्त कहा है, यह W7 पर काम करता है (दूसरा प्रयास कभी निष्पादित नहीं होता है क्योंकि यह मिक्सर ओपन (आउट मिक्सर, एमएक्सआईडी, 0, 0, MIXER_OBJECTF_WAVEIN) का उपयोग करने में विफल नहीं होता है)।

मैं मिक्सर एपीआई पर अच्छी समझ नहीं लेता हूं, इसलिए मैं अब देख रहा हूं; हालांकि अगर किसी के पास कोई सुराग है तो यह W7 पर क्यों काम करेगा, लेकिन XP नहीं, मैं निश्चित रूप से इसे सुनना चाहता हूं। इस बीच, अगर मैं प्रतिक्रिया प्राप्त करने से पहले इसे समझता हूं, तो मैं अपना उत्तर पोस्ट करूंगा ...

उत्तर

1

निम्नलिखित कोड अब मेरे लिए ठीक काम करने के लिए (अद्यतन 2010/06/29) लगता है के साथ समाप्त हो गया है। ध्यान दें कि मेरे टेस्ट केस मेरे दो पीसी हैं, एक डब्ल्यू 7 है जबकि दूसरा एक्सपी है, इसलिए यह निर्णायक नहीं है। मैंने सत्यापित किया है कि यह सभी मशीनों के लिए काम नहीं करता है, लेकिन जिन लोगों के लिए वे करते हैं, उनके लिए यह ठीक लगता है।

public static bool setMicVolume(int mxid, int percentage) 
    { 
     if (mixerdisabled) 
      return(false); 

     bool rc; 
     int mixer, vVolume, ctrltype, comptype; 
     MIXERCONTROL volCtrl = new MIXERCONTROL(); 
     int currentVol; 
     int mr = mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN); 
     if (mr != MMSYSERR_NOERROR) 
     { 
      Warning("mixerOpen() failed: " + mr.ToString()); 
      mixerdisabled = true; 
      return(false); 
     } 
     ctrltype = MIXERCONTROL_CONTROLTYPE_VOLUME; 
     comptype = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; 
     rc = GetVolumeControl(mixer, comptype, ctrltype, out volCtrl, out currentVol); 
     if (rc == false) 
     { 
      Warning("SetMicVolume/GetVolumeControl() failed"); 
      mixerdisabled = true; 
      mixerClose(mixer); 
      return(false); 
     } 
     vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum)/100.0F) * percentage); 
     rc = SetVolumeControl(mixer, volCtrl, vVolume); 
     if (rc == false) 
     { 
      Warning("SetMicVolume/SetVolumeControl() failed"); 
      mixerdisabled = true; 
      mixerClose(mixer); 
      return (false); 
     } 
     mixerClose(mixer); 
     return (true); 
    } 

सूचना मुख्य अंतर यह है कि मैं बजाय 'MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE' के 'MIXERLINE_COMPONENTTYPE_DST_WAVEIN' के एक घटक के प्रकार का उपयोग कर रहा है। वास्तव में इसे समझ में न लें, इसलिए यदि कोई स्पष्टीकरण के साथ झुकना चाहता है (या मुझे यह बताने के लिए कि यह सामान्य रूप से काम नहीं करेगा), तो मैं जवाबों का स्वागत कर रहा हूं!

+0

ध्यान दें कि मेरे पास पहले से ही एक एक्सपी मशीन है जो यह विफल रही है, इसलिए यह अभी भी सही नहीं है ... –

+0

आपके कोड में int mxid क्या है? एक कैसे प्राप्त करें? –

1

मैंने कुछ समय पहले ऐसा करने की कोशिश की जब मैं .NET Voice Recorder न्यूडियो का उपयोग करके लिख रहा था, और इसे बहुत कठिन पाया। आपको शायद दो कोडों को लिखना होगा, एक एक्सपी के लिए और एक विस्टा/विन 7 के लिए। मैं मिक्सर इंटरऑप के लिए NAudio का उपयोग कर रहा हूं।

यह है कि मैं क्या (अभी भी हर जगह काम नहीं करता है)

private void TryGetVolumeControl() 
    { 
     int waveInDeviceNumber = waveIn.DeviceNumber; 
     if (Environment.OSVersion.Version.Major >= 6) // Vista and over 
     { 
      var mixerLine = new MixerLine((IntPtr)waveInDeviceNumber, 0, MixerFlags.WaveIn); 
      foreach (var control in mixerLine.Controls) 
      { 
       if (control.ControlType == MixerControlType.Volume) 
       { 
        volumeControl = control as UnsignedMixerControl; 
        MicrophoneLevel = desiredVolume; 
        break; 
       } 
      } 
     } 
     else 
     { 
      var mixer = new Mixer(waveInDeviceNumber); 
      foreach (var destination in mixer.Destinations) 
      { 
       if (destination.ComponentType == MixerLineComponentType.DestinationWaveIn) 
       { 
        foreach (var source in destination.Sources) 
        { 
         if (source.ComponentType == MixerLineComponentType.SourceMicrophone) 
         { 
          foreach (var control in source.Controls) 
          { 
           if (control.ControlType == MixerControlType.Volume) 
           { 
            volumeControl = control as UnsignedMixerControl; 
            MicrophoneLevel = desiredVolume; 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

    } 
+0

मार्क, त्वरित प्रतिक्रिया के लिए धन्यवाद। इससे पहले नूडियो के बारे में नहीं सुना था (जो मुझे आश्चर्यचकित करता है क्योंकि पिछले कुछ महीनों में मैं पीसी पर विभिन्न ऑडियो मुद्दों के लिए 'गुगलिंग' कर रहा हूं)। यह बहुत परिपक्व दिखता है। मैं उस पर एक नज़र डालेगा; हालांकि, मैं निश्चित रूप से मूल मिक्सर एपीआई का उपयोग करके समाधान ढूंढना चाहता हूं, इसलिए मैं केवल माइक्रो-वॉल्यूम-कंट्रोल करने के लिए एक बड़े पैकेज में खींचने से बच सकता हूं। –

+0

मार्क, मैं NAudio पैकेज ब्राउज़ कर रहा हूं (वास्तव में साफ दिखता है); लेकिन मुझे mixerOpen() के लिए कोई कॉल नहीं दिख रहा है। यदि वह अवलोकन सही है, तो म्यूसर का उपयोग करके नूडियो कैसे है? –

+0

आपको –