c # Naudio Захват и отображение уровня звука, работает только когда открыто свойство записи звука - PullRequest
0 голосов
/ 16 мая 2018

Я пытался прочитать текущий уровень звука аудиовхода, используя эти данные для обновления панели progess, а также используя данные для принятия решения, используя пакет NAudio NuGet в VS2015 (фактически 3 входа), но могуполучить уровень звука только при открытой панели управления звуком и на вкладке записи.

Есть несколько сообщений на эту Naudio AudioMeterInformation и Измеритель уровня звука для записи NAudio , но я не могу заставить это работать, я явно что-то здесь упускаюно просто не понимаю, может кто-нибудь помочь.если есть лучший способ сделать это, это было бы здорово, я открыт для любой помощи

Вот что я делаю, при запуске приложения я проверяю наличие звуковых устройств и помещаю их в поле со списком

public void runGUISetup()
    {
        //Check for ini file
        if (File.Exists(iniFile))
        {
            // Set the IP Address of Vmix from INI File
            if (VmixIPAddress.Value != "")
            {
                tbVmixIPAddress.Text = VmixIPAddress.Value;
            }
            else
            {

            }

        }
        try
        { 
            // Enumerate soundcards and add to combobox
            MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
            var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
            cBoxSoundCard1.Items.AddRange(devices.ToArray());
            cBoxSoundCard2.Items.AddRange(devices.ToArray());
            cBoxSoundCard3.Items.AddRange(devices.ToArray());

            //Enumerate IP Local Addresses
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());                
            //Populate the drop down list with local IP's
            cbListeningServerIP.Items.AddRange(ipHostInfo.AddressList);
        }
        catch (Exception erSoundcard)
        {
            tbDebug.Text += erSoundcard.Message;                
        }

Затем я запускаю таймер, который собирает текущий уровень звука и сбрасывает его в скользящее среднее, а затем обновляет индикатор прогресса.Это бит, который не работает и работает только тогда, когда свойства звука открыты.

        // check audio level every 10ms and store in moving average
    private void tmrSC1_Tick(object sender, EventArgs e)
    {

        if (appActive == true)
        {
            if (cBoxSoundCard1.SelectedItem != null)
            {
                var device1 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard1.SelectedItem;
                avg1.AddSample((device1.AudioMeterInformation.MasterPeakValue * 100));
            }
            else
            {

            }
            if (cBoxSoundCard2.SelectedItem != null)
            {
                var device2 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard2.SelectedItem;
                avg2.AddSample((device2.AudioMeterInformation.MasterPeakValue * 100));

            }
            else
            {
            }
            if (cBoxSoundCard3.SelectedItem != null)
            {
                var device3 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard3.SelectedItem;
                avg3.AddSample((device3.AudioMeterInformation.MasterPeakValue * 100));
            }
            else
            {
            }
        }

    }

Обновление: В дополнение к отзывам Криса, это работает, но только если я жестко закодирую номер устройства, разница между двумя различными способами перечисления звуковых устройств (wave и coreaudioAPI)) нумерация устройств различна, а также расшифровка каждого устройства, поэтому, я думаю, мне нужно будет сопоставить имя устройства какого-либо другого случая ?, хотя это может привести к сбою.Я могу ошибаться, поскольку я новичок в этом.как всегда любая помощь будет принята.меня также поражает, что, может быть, я мог бы сделать список устройств, используя тот же метод?(coreaudioAPI), а затем положить устройство для записи, я просто не уверен, как это сделать.

UI Display showing selected coreaudioAPI device

1 Ответ

0 голосов
/ 08 июня 2018

У меня была точно такая же проблема - я обошел ее, начав записывать это устройство - даже если вы ничего не делаете с ним. Для вас вам нужно будет начать запись на 3-х устройствах.

    // deviceno is an index of the returned devices from enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);


    void StartAudioDevice(int deviceno)
    {            

        if (deviceno >= 0)
        {
            try
            {
                wavIn = new WaveInEvent();
                wavIn.DeviceNumber = deviceno;
                wavIn.WaveFormat = new WaveFormat(44100, 1);                    
                wavIn.StartRecording();
            }
            catch(Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    }

    void StopAudioDevice()
    {
        try
        {
            wavIn.StopRecording();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
...