忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

OpenAL ファイルイメージからBufferを作成 [C#]

alutCreateBufferFromFileImage
ファイル名からBufferオブジェクトを作るのはalutCreateBufferFromFile関数でしたが、もうちょっと柔軟にできないものでしょうか?

たとえばインターネット上からwavファイルをダウンロードして、それを再生するような場合です。
いちいちハードディスクに保存しなくても再生できないものでしょうか?

alutCreateBufferFromFileImage関数がそれを可能にします。
この関数は、wavファイルのbyte[] からBufferオブジェクトを作成します。
つまり、wavファイルがハードディスク上に保存されている必要はありません。中身のbyte配列がメモリにあればいいのです。

ALuint alutCreateBufferFromFileImage(const ALvoid *data, ALsizei length);

成功すれば生成されたBufferオブジェクトの名前を、失敗すればAL_NONE( = 0)を返します。
using System;
using System.Runtime.InteropServices;

class AudioSource
{
    [DllImport("OpenAL32.dll")]
    static extern void alGenSources(int resultSize, int[] result);

    [DllImport("OpenAL32.dll")]
    static extern void alDeleteSources(int nameCount, int[] sourceNames);

    [DllImport("OpenAL32.dll")]
    static extern void alSourcei(int sourceName, int propertyType, int value);
    const int AL_BUFFER = 0x1009;

    [DllImport("OpenAL32.dll")]
    static extern void alSourcePlay(int sourceName);

    private int name;

    public AudioSource()
    {
        int[] names = new int[1];
        alGenSources(names.Length, names);
        this.name = names[0];
    }

    ~AudioSource()
    {
        alDeleteSources(1, new int[] { this.name });
    }

    public int Buffer
    {
        set
        {
            alSourcei(this.name, AL_BUFFER, value);
        }
    }

    public void Play()
    {
        alSourcePlay(this.name);
    }
}

class AudioBuffer
{
    [DllImport("alut.dll")]
    static extern int alutCreateBufferFromFileImage(byte[] data, int dataLength);

    [DllImport("OpenAL32.dll")]
    static extern void alDeleteBuffers(int nameCount, int[] bufferNames);

    private int name;

    public int Name { get { return this.name; } }

    public AudioBuffer(byte[] fileImage)
    {
        this.name = alutCreateBufferFromFileImage(fileImage, fileImage.Length);
    }

    ~AudioBuffer()
    {
        alDeleteBuffers(1, new int[] { name });
    }

}

class Program
{
    [DllImport("alut.dll")]
    static extern void alutInit(IntPtr argcp, string[] argv);
    [DllImport("alut.dll")]
    static extern void alutExit();


    static void Main()
    {
        alutInit(IntPtr.Zero, null);

        AudioBuffer buffer = new AudioBuffer(
            System.IO.File.ReadAllBytes("damage1.wav")
            );
        AudioSource source = new AudioSource();
        source.Buffer = buffer.Name;
        source.Play();
        System.Threading.Thread.Sleep(2000);

        alutExit();
    }
}


ここでは、File.ReadAllBytesメソッドを使っていったん"damage1.wav"をメモリ上にbyte[]として読み込んでいます。
それをalutCreateBufferFromFileImageに渡しているのです。

実行結果はあいかわらず「ボガァン」という音です。

拍手[0回]

PR