SDL_AudioDeviceID SDL_OpenAudioDevice(SDL_AudioDeviceID devid, const SDL_AudioSpec *spec);
SDL_AudioDeviceID | devid | オープンするデバイスインスタンスID, またはSDL_AUDIO_DEVICE_DEFAULT_PLAYBACKまたはSDL_AUDIO_DEVICE_DEFAULT_RECORDINGで最も適したデフォルトデバイス |
const SDL_AudioSpec * | spec | デバイスの設定. NULLで適切なデフォルト設定にできる |
(SDL_AudioDeviceID) オーディオデバイスIDを戻す. 失敗のとき0を戻す. SDL_GetError()を呼んで詳細を知ることができる.
この関数で録音と再生の両方のデバイスをオープンできる. 再生デバイスは, バインドされたオーディオストリームからデータを得て, ミックスし, それをハードウェアに送信する. 録音デバイスは, バインドされたオーディオストリームに送られたデータのコピーを渡す.
オープンされたオーディオデバイスは, オーディオストリームがバインドされていない状態から始まる. 再生を始めるには, ストリームをバインドし, そこにオーディオデータを供給する. SDL2とは異なり, オーディオコールバックは存在しない. オーディオストリームをバインドし, そこにデータが流し込まれていることを確認するだけである(しかし, この関数の代わりにSDL_OpenAudioDeviceStreamを使えば, SDL2とかなり近い方法に似せることができる).
どのデバイスをオープンするのかが問題にならないならば, devid
にSDL_AUDIO_DEVICE_DEFAULT_PLAYBACKまたはSDL_AUDIO_DEVICE_DEFAULT_RECORDINGを渡す.
この場合, SDLは最も適したデフォルトを選択しようとする. そして, 最も適したデフォルトがオープン中に変わった(ユーザがOSのシステム設定のデフォルトを変更した, デフォルトが取り外されシステムが新しいデフォルトに移した, モバイル端末のヘッドホンを抜いた, など)場合は, 物理デバイスを切り替える.
特定のデバイスを選択する理由がない場合は, 恐らくこれが求めていることである.
オーディオデバイスには特定の形式を要求できるが, いくつもの理由で要求の通りになるとは限らない. そのため, 要求した形式は, どのようなデータをアプリケーションが提供するかのヒントに過ぎない. オーディオストリームは, アプリケーションが特定したどのような形式のデータも適切に変換して受け入れることができる. SDL_GetAudioDeviceFormatで, オープンする前にデバイスにアプリケーションが望む形式を伝え, オープンした後は実際の形式を使用することができる.
同じデバイスIDで2回以上オープンするのは正しい. オープンはそれぞれ成功し, 同じ物理デバイスであっても別々に管理される新しい論理SDL_AudioDeviceIDが生成される. これにより, ライブラリがメインアプリケーションとは別にデバイスをオープンし, 衝突なしに自身のストリームとバインドできる.
以前この関数を呼んで戻ったデバイスIDをオープンすることも正しい. 同じ物理デバイスに対して別の論理デバイスが生成されるだけである. これはオーディオストリームの論理グループを作るときに役立ちうる.
この関数が成功するとオープンしたデバイスIDを戻す. これは新規のユニークなSDL_AudioDeviceIDで, 論理デバイスを表している.
一部のバックエンドは不特定のデバイス(例えば, 不特定のサーバと接続するネットワークオーディオプロトコル)を提供する. このような場合は, SDL2とは違い, デフォルトデバイスIDをオープンし, 必要ならばSDLヒントで対象を特定するか, 適切なデフォルトをバックエンドに選ばせる. ほとんどのバックエンドにはこのような機能はなく, アプリケーションが明確に指定したものではなく, 必要に応じてエンドユーザに環境変数を設定させることになる.
オーディオデバイスを使い終えたならば, アプリケーションの終了時に戻されたデバイスIDに対してSDL_CloseAudioDevice()を呼ぶ必要がある.
この関数はどのスレッドからも安全に呼べる.
SDL_AudioSpec want;
SDL_AudioDeviceID dev;
SDL_memset(&want, 0, sizeof(want)); /* または SDL_zero(want) */
want.format = SDL_AUDIO_F32;
want.channels = 2;
want.freq = 48000;
dev = SDL_OpenAudioDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &want);
if (dev == 0) {
SDL_Log("オーディオオープン失敗: %s", SDL_GetError());
} else {
SDL_ResumeAudioDevice(dev); /* 再生を開始する */
SDL_Delay(5000); // デバイスに5秒間再生させる
SDL_CloseAudioDevice(dev);
}