2

私は以下を使用してデバイスを初期化しました:

static  IWavePlayer     waveOut;
static  WaveFormat      waveFormat;
static  BufferedWaveProvider    waveProvider;

private static int AudioDeviceInit()
{
            waveOut = new DirectSoundOut();
            waveFormat = new WaveFormat(44100, 2);
            waveProvider = new BufferedWaveProvider(waveFormat);

            waveOut.Init(waveProvider);
            waveOut.Play();

            return 0;
}

私はそれにpcmストリームを追加しています:

waveProvider.AddSamples(samples, 0, size);

ストリームデータが同じ構成である限り、上記は正常に機能します。

サンプルレートとチャネル数を受け取る別の関数があり、新しく提供された構成を使用するようにwaveproviderを再構成したいと思います。これが私が使用しているコードです:

private static void AudioConfigCallback(int rate, int channel)
{
    waveFormat = new WaveFormat(rate, channel);
    waveProvider = new BufferedWaveProvider(waveFormat);
    waveOut.Init(waveProvider);
    return;
}

これは機能しておらず、これも正しい方法ではないと思います。新しいsample_rateとnum_channelsを使用するようにデバイスを再構成する方法についてのアイデア

ありがとう。

4

1 に答える 1

2

これは不可能です。WaveOut、Direct Sound、WASAPI、ASIOのいずれの場合でも、出力デバイスを開くときは、その時点で、作業する形式を指定する必要があります。出力デバイスを閉じて、新しいWaveFormatで再度開く必要があります。

別のアプローチは、常に固定のWaveFormatに変換し、WaveFormatConversionStreamを使用して、着信形式が変更されるたびに正しい形式に変換することです。これにより、出力デバイスの開閉を回避できます。

于 2011-07-21T13:34:12.257 に答える