クイックスタート
1
DLL を配置する
mruvorbis.dll を呼び出し元 EXE と同じフォルダに配置します。
Visual C++ 再頒布可能パッケージ (vcredist) が未インストールの場合はインストールしてください。
2
DLL を動的ロードする
LoadLibraryW(L"mruvorbis.dll") で DLL をロードします。
スタティックリンクやインポートライブラリは不要です。
3
関数ポインタを取得する
GetProcAddress() で必要な関数ポインタを取得します。
VorbisDllExports.h に全 API のシグネチャが記載されています。
4
初期化して再生する
Vorbis_InternalInit() → VorbisPlayer_Create() →
VorbisPlayer_LoadFile() → VorbisPlayer_Play() の順に呼び出します。
終了時は VorbisPlayer_Destroy() → Vorbis_FinalizeAll() → FreeLibrary()。
API 早見表
初期化 / 終了
| Vorbis_InternalInit() | DLL 初期化(起動直後に 1 度呼ぶ) |
| Vorbis_FinalizeAll() | DLL 終了処理(FreeLibrary 前に呼ぶ) |
| Vorbis_GetVersionString() | バージョン文字列取得(wchar_t*)— __stdcall |
| Vorbis_GetBuildInfo() | ビルド情報取得(SIMD レベル等)— __stdcall |
| Vorbis_GetLastError() | 最後のエラーメッセージ取得(char*) |
再生 (VorbisPlayer) — 基本操作
| VorbisPlayer_Create() | プレイヤーハンドル作成 |
| VorbisPlayer_Destroy(h) | プレイヤー破棄 |
| VorbisPlayer_LoadFile(h, path) | ファイルロード(wchar_t* パス) |
| VorbisPlayer_LoadFromMemory(h, data, sz) | メモリバッファからロード |
| VorbisPlayer_Play(h) | 再生開始 |
| VorbisPlayer_Stop(h) | 再生停止 |
| VorbisPlayer_Pause(h, BOOL) | 一時停止 / 再開 |
| VorbisPlayer_SeekMs(h, ms) | ミリ秒シーク |
| VorbisPlayer_IsPlaying(h) | 再生中判定 |
| VorbisPlayer_IsPaused(h) | 一時停止中判定 |
再生 (VorbisPlayer) — 音量 / パン / フェード
| VorbisPlayer_SetVolume(h, vol) | 音量設定(0.0〜1.0) |
| VorbisPlayer_GetVolume(h) | 音量取得 |
| VorbisPlayer_SetMute(h, BOOL) | ミュート設定 |
| VorbisPlayer_IsMuted(h) | ミュート状態取得 |
| VorbisPlayer_SetPan(h, pan) | パン設定(-1.0=左 / 0.0=中央 / 1.0=右) |
| VorbisPlayer_GetPan(h) | パン取得 |
| VorbisPlayer_StartFadeIn(h, ms) | フェードイン開始 |
| VorbisPlayer_StartFadeOut(h, ms) | フェードアウト開始 |
再生 (VorbisPlayer) — ループ / 情報取得
| VorbisPlayer_SetLoop(h, BOOL) | ループ設定 |
| VorbisPlayer_GetPositionMs(h) | 現在位置取得(ms) |
| VorbisPlayer_GetTotalMs(h) | 総時間取得(ms) |
| VorbisPlayer_GetTotalSamples(h) | 総サンプル数取得 |
| VorbisPlayer_GetSampleRate(h) | サンプルレート取得(ファイルに依存) |
| VorbisPlayer_GetChannels(h) | チャンネル数取得 |
| VorbisPlayer_GetBitrate(h) | ビットレート取得 |
| VorbisPlayer_DumpState(h) | デバッグ状態文字列取得(char*) |
クロスフェード (VorbisCrossfade)
| VorbisCrossfade_Create() | クロスフェードマネージャー作成 |
| VorbisCrossfade_Destroy(h) | マネージャー破棄 |
| VorbisCrossfade_Play(h, path, loop) | 再生開始 |
| VorbisCrossfade_CrossfadeTo(h, path, ms, loop) | クロスフェード切り替え(ms でフェード時間指定) |
| VorbisCrossfade_Stop(h, fadeMs) | 停止(フェードアウト付き) |
| VorbisCrossfade_Pause(h, BOOL) | 一時停止 / 再開 |
| VorbisCrossfade_SetVolume(h, vol) | マスター音量設定 |
| VorbisCrossfade_IsPlaying(h) | 再生中判定 |
| VorbisCrossfade_IsCrossfading(h) | クロスフェード中判定 |
| VorbisCrossfade_GetPositionMs(h) | 現在再生位置取得(ms) |
効果音プール (VorbisSePool)
| VorbisSePool_Init(voices) | プール初期化(最大ボイス数指定) |
| VorbisSePool_Finalize() | プール破棄 |
| VorbisSePool_Play(path, vol) | SE 再生(ボイスハンドル返却) |
| VorbisSePool_Stop(handle) | 指定 SE 停止 |
| VorbisSePool_StopAll() | 全 SE 停止 |
| VorbisSePool_SetVolume(h, vol) | ボイス音量設定 |
| VorbisSePool_GetVolume(h) | ボイス音量取得 |
| VorbisSePool_GetActiveCount() | 再生中ボイス数取得 |
エンコード (VorbisEncoder)
| VorbisEncoder_Create(ch, sr, quality) | エンコーダ作成(quality: -0.1〜1.0) |
| VorbisEncoder_GetHeaders(enc, ...) | Vorbis ヘッダパケット取得 |
| VorbisEncoder_EncodeFrame(enc, pcm, ...) | フレームエンコード(float PCM → Vorbis パケット) |
| VorbisEncoder_PollPacket(enc, ...) | エンコード済みパケット取り出し |
| VorbisEncoder_Flush(enc, ...) | 残留パケットをフラッシュ |
| VorbisEncoder_Finish(enc, totalSamples, cb) | EOS 通知・最終パケット生成 |
| VorbisEncoder_FreeBuffer(buf) | バッファ解放 |
| VorbisEncoder_Destroy(enc) | エンコーダ破棄 |
| Vorbis_WriteOggFileFromPacketsW(...) | パケット列から Ogg ファイル書き出し |
mruvorbis_sample の実行方法
mruvorbis_sample.cpp は LoadLibrary を使った動的ロードのサンプルソースです。コマンドライン引数でファイルを指定する仕様のため、バッチファイル経由の起動が最も手軽です。
ビルド方法
Visual Studio 2022 でソリューションを開いてビルドします。
sample\project\VC2022\mruvorbis_sample.sln
ℹ️
ビルド後、mruvorbis.dll はポストビルドイベントにより出力先(x64\Release\ 等)へ自動コピーされます。
コマンドラインでビルドする場合は Developer Command Prompt を開き、sample\project\VC2022\ フォルダで以下を実行します。
cl ..\..\src\mruvorbis_sample.cpp /std:c++20 /W3 /EHsc /Fe:mruvorbis_sample.exe
その後、bin\mruvorbis.dll を実行ファイルと同じフォルダにコピーしてください。
実行方法 (1) — コマンドプロンプトから直接実行
bin\ フォルダ内で実行します。
REM BGM のみ再生
mruvorbis_sample.exe bgm.ogg
REM BGM + SE(S キーで SE を再生)
mruvorbis_sample.exe bgm.ogg se.ogg
実行方法 (2) — バッチファイルを使用(推奨)
run_sample.bat
@echo off
cd /d "%~dp0"
mruvorbis_sample.exe bgm.ogg se.ogg
pause
実行方法 (3) — ドラッグ&ドロップ起動バッチ
音声ファイルをバッチアイコンにドラッグ&ドロップするだけで再生できます。
drop_play.bat
@echo off
cd /d "%~dp0"
if "%~1"=="" (
echo ファイルをこのバッチにドラッグ&ドロップしてください。
pause
exit /b 1
)
mruvorbis_sample.exe "%~1" "%~2"
pause
操作キー一覧
Space 一時停止 / 再開
← Left 5 秒 巻き戻し
→ Right 5 秒 早送り
↑ Up 音量 +10%
↓ Down 音量 -10%
M ミュート切り替え
L ループ切り替え
I フェードイン(2 秒)
O フェードアウト(2 秒)
P パン切り替え(左 → 中央 → 右)
S SE 再生(引数 2 が指定されている場合)
Q / ESC 終了
最小実装例(C++ / LoadLibrary)
// mruvorbis.dll を動的ロードして bgm.ogg を再生する最小限のコード
#include <windows.h>
typedef void* VORBIS_HANDLE;
int wmain() {
HMODULE hDll = LoadLibraryW(L"mruvorbis.dll");
auto Init = (BOOL (__cdecl*)()) GetProcAddress(hDll, "Vorbis_InternalInit");
auto Fin = (void (__cdecl*)()) GetProcAddress(hDll, "Vorbis_FinalizeAll");
auto Create = (VORBIS_HANDLE (__cdecl*)()) GetProcAddress(hDll, "VorbisPlayer_Create");
auto Destroy = (void (__cdecl*)(VORBIS_HANDLE)) GetProcAddress(hDll, "VorbisPlayer_Destroy");
auto Load = (BOOL (__cdecl*)(VORBIS_HANDLE, const wchar_t*))
GetProcAddress(hDll, "VorbisPlayer_LoadFile");
auto Play = (BOOL (__cdecl*)(VORBIS_HANDLE)) GetProcAddress(hDll, "VorbisPlayer_Play");
auto Stop = (void (__cdecl*)(VORBIS_HANDLE)) GetProcAddress(hDll, "VorbisPlayer_Stop");
Init();
VORBIS_HANDLE h = Create();
Load(h, L"bgm.ogg");
Play(h);
Sleep(5000); // 5 秒再生
Stop(h);
Destroy(h);
Fin();
FreeLibrary(hDll);
return 0;
}
トラブルシューティング
LoadLibrary が失敗する
mruvorbis.dll が EXE と同じフォルダにあるか確認してください。EXE と DLL のビット数(x86 / x64)が一致しているか、Visual C++ 再頒布可能パッケージがインストール済みかどうかもご確認ください。
VorbisPlayer_Play が FALSE を返す
Vorbis_InternalInit() を呼んでいるか確認してください。Vorbis_GetLastError() でエラー内容を確認し、ファイルが有効な Ogg Vorbis 形式かどうかをご確認ください。
音が出ない
出力デバイスが存在しミュートされていないか確認してください。他のアプリが WASAPI 排他モードでデバイスを占有していないか、VorbisPlayer_GetVolume() で音量が 0 になっていないかも確認してください。
EXE 終了時にクラッシュする
FreeLibrary() の前に必ず Vorbis_FinalizeAll() を呼んでください。内部スレッドが join されずにプロセスが終了するとクラッシュします。