2

NAudioを使用して、WaveStreamsではなくWaveMixerStream32をWaveProvidersにリンクする方法はありますか?BufferedWaveProviderを使用して、複数のネットワークストリームをストリーミングしています。それをWaveStreamに変換する簡単な方法はないようです。

乾杯!

ルーク

4

1 に答える 1

6

IWaveProviderをWaveStreamに変換するのはかなり簡単です。IWaveProviderは、再配置をサポートせず、長さが不明な単純化されたWaveStreamです。次のようなアダプタを作成できます。

public class WaveProviderToWaveStream : WaveStream
{
    private readonly IWaveProvider source;
    private long position;

    public WaveProviderToWaveStream(IWaveProvider source)
    {
        this.source = source;
    }

    public override WaveFormat WaveFormat
    {
        get { return source.WaveFormat;  }
    }

    /// <summary>
    /// Don't know the real length of the source, just return a big number
    /// </summary>
    public override long Length
    {
        get { return Int32.MaxValue; } 
    }

    public override long Position
    {
        get
        {
            // we'll just return the number of bytes read so far
            return position;
        }
        set
        {
            // can't set position on the source
            // n.b. could alternatively ignore this
            throw new NotImplementedException();
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int read = source.Read(buffer, offset, count);
        position += read;
        return read;
    }
}

長さと位置のプロパティについていくつかコメントを入れました。それらをどうする必要があるかは、これを渡すクラスがそれらのプロパティを利用しようとするかどうかによって異なります。

また、IWaveProviderで動作する独自のバージョンのWaveMixerStream32を作成することを妨げるものは何もありません。入力を再配置できないため、ミキサーに再配置ロジックを実装する必要がないため、作業を大幅に簡素化できます。

于 2011-07-09T19:39:19.627 に答える