6

一部のC#WindowsPhone7アプリをWindows8に移植しています。

電話アプリは、XNA SoundEffectを使用して、バッファーから任意のサウンドを再生しました。最も単純なケースでは、必要な持続時間と周波数の正弦波を作成するだけです。継続時間と頻度の両方が大きく異なる可能性があるため、MediaElementsに依存しないことをお勧めします(ベースファイルの頻度をシフトする方法がない限り、それは単一の頻度の生成にのみ役立ちます)。

WinRTのXNASoundEffectInstanceに相当するものは何ですか?

これにはDirectXを使用する必要があると思いますが、それ以外の場合はC#/XAMLアプリからこれを実行する方法がわかりません。SharpDXを見てきましたが、使用する必要があると思われるDirectSound、SecondaryBuffer、SecondaryBufferクラスがないようです。

私は上記のいくつかの仮定をしました。間違ったクラスを探しているか、Windows8アプリから任意のサウンドを生成するまったく別の方法がある可能性があります。


SharpDXのXAudio2を使用してAudioBuffer経由でwavファイルを再生する例を見つけました。これは有望なようです。生成されたオーディオバッファをネイティブファイルストリームに置き換える必要があります。

PM>インストール-パッケージSharpDX

PM>インストール-パッケージSharpDX.XAudio2

    public void PlaySound()
    {
        XAudio2 xaudio;
        MasteringVoice masteringVoice;

        xaudio = new XAudio2();
        masteringVoice = new MasteringVoice(xaudio);

        var nativefilestream = new NativeFileStream(
            @"Assets\SpeechOn.wav",
            NativeFileMode.Open,
            NativeFileAccess.Read,
            NativeFileShare.Read);

        var soundstream = new SoundStream(nativefilestream);


        var waveFormat = soundstream.Format;
        var buffer = new AudioBuffer
        {
            Stream = soundstream.ToDataStream(),
            AudioBytes = (int)soundstream.Length,
            Flags = BufferFlags.EndOfStream
        };

        var sourceVoice = new SourceVoice(xaudio, waveFormat, true);

        // There is also support for shifting the frequency.
        sourceVoice.SetFrequencyRatio(0.5f);

        sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo);

        sourceVoice.Start();
    }
4

2 に答える 2

10

Win8RTでダイナミックサウンドを生成する唯一の方法はXAudio2を使用することであるため、SharpDX.XAudio2でこれを実行できるはずです。

NativeFileStreamを使用する代わりに、DataStreamをインスタンス化して、管理対象バッファーを直接提供します(または、管理対象外バッファーを使用するか、DataStreamにインスタンス化させることができます)。コードは次のようになります。

// Initialization phase, keep this buffer during the life of your application
// Allocate 10s at 44.1Khz of stereo 16bit signals
var myBufferOfSamples = new short[44100 * 10 * 2];

// Create a DataStream with pinned managed buffer
var dataStream = DataStream.Create(myBufferOfSamples, true, true);

var buffer = new AudioBuffer
        {
            Stream = dataStream,
            AudioBytes = (int)dataStream.Length,
            Flags = BufferFlags.EndOfStream
        };

//...
// Fill myBufferOfSamples
//...

// PCM 44.1Khz stereo 16 bit format
var waveFormat = new WaveFormat();

XAudio2 xaudio = new XAudio2();
MasteringVoice masteringVoice = new MasteringVoice(xaudio);
var sourceVoice = new SourceVoice(xaudio, waveFormat, true);

// Submit the buffer
sourceVoice.SubmitSourceBuffer(buffer, null);

// Start playing
sourceVoice.Start();

バッファを正弦波で満たすサンプルメソッド:

    private void FillBuffer(short[] buffer, int sampleRate, double frequency)
    {
        double totalTime = 0;

        for (int i = 0; i < buffer.Length - 1; i += 2)
        {
            double time = (double)totalTime / (double)sampleRate;
            short currentSample = (short)(Math.Sin(2 * Math.PI * frequency * time) * (double)short.MaxValue);

            buffer[i] = currentSample; //(short)(currentSample & 0xFF);
            buffer[i + 1] = currentSample; //(short)(currentSample >> 8);

            totalTime += 2;
        }

    }
于 2012-09-22T22:34:58.233 に答える
2

WASAPIを使用して、WinRTで動的に生成されたサウンドバッファを再生することもできます。(xaudio2だけが解決策ではありません)。

ここにVBでサンプルコードを記述しました(C#は基本的に同じです): http: //www.codeproject.com/Articles/460145/Recording-and-playing-PCM-audio-on-Windows-8-VB

NAudioの担当者は、Win8でサポートされているバージョンのために、サンプルコードをNAudioに変換して組み込むことを計画していると思います。これにより、使いやすくなります。

于 2012-11-29T21:21:22.893 に答える