0
votes

I'm trying to capture all sound going through the computer to manipulate and play it in realTime (there can be a slight delay due to manipulation but nothing too serious).

I'm trying to do this using Naudio wasapi. The problem is: When I do it in exclusive mode, this line: audioClient.Initialize(shareMode, AudioClientStreamFlags.EventCallback, latencyRefTimes, latencyRefTimes,outputFormat, Guid.Empty);

throws this exception:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in NAudio.dll

Additional information: HRESULT: 0x88890016

When I do it in shared mode I get lot of noise which I think is caused by sound feedback (similiar to what happens when recording and playing at the same time)

Here's my code:

WasapiLoopbackCapture source = new WasapiLoopbackCapture();

        source.DataAvailable += CaptureOnDataAvailable;

        bufferedWaveProvider = new BufferedWaveProvider(source.WaveFormat);

        volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());

        WasapiOut soundOut = new WasapiOut(AudioClientShareMode.Shared, 0);

        soundOut.Init(volumeProvider);
        soundOut.Play();

        source.StartRecording();

        soundOut.Volume = 0.5f;
    }

    private void CaptureOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
    {

        int length = waveInEventArgs.Buffer.Length;

        byte[] byteSamples = new Byte[length];
        float[] buffer = waveInEventArgs.Buffer.toFloatArray(waveInEventArgs.BytesRecorded);//buffer to contains the samples about to be manipulated


        fixer.fixSamples(length / 2, buffer, ref fixedSamples);


        if (fixedSamples.Count > 0)
        {
            //convert the fixed samples back to bytes in order for them to be able to play out
            byteSamples = fixedSamples.convertToByteArray(position);

            bufferedWaveProvider.AddSamples(byteSamples, 0, byteSamples.Length);
            volumeProvider.Volume = .5f;
        }

        position = fixedSamples.Count;

    }

How can I solve these problems?

Also, I don't know if it's the best approach for what i'm trying to do, so if anyone has a better idea how to do this I'm more than happy to hear. (i thought about using asio, but decided not to since there are a lot of computers without an asio driver)

1

1 Answers

0
votes

this error is AUDCLNT_E_UNSUPPORTED_FORMAT You can only capture audio in certain formats with WASAPI. Usually has to be IEEE float, stereo, 44.1kHz / 48kHz