#include #include #include #pragma comment(lib, "winmm.lib") int main() { // 音声ファイルのパス LPCWSTR filePath = L"C:\\Users\\SEEDAGX\\source\\repos\\CAudio\\0321.wav"; // WAVEファイルのフォーマット情報 WAVEFORMATEX waveFormat; memset(&waveFormat, 0, sizeof(WAVEFORMATEX)); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = 2; // ステレオ waveFormat.nSamplesPerSec = 44100; // サンプリングレート waveFormat.wBitsPerSample = 16; // サンプルあたりのビット数 waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; // デバイスのオープン HWAVEOUT hWaveOut; MMRESULT result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveFormat, 0, 0, CALLBACK_NULL); if (result != MMSYSERR_NOERROR) { printf("デバイスのオープンに失敗しました。エラーコード: %d\n", result); return 1; } // WAVEファイルのオープン HMMIO hmmio = mmioOpen((LPWSTR)filePath, NULL, MMIO_READ | MMIO_ALLOCBUF); if (hmmio == NULL) { printf("WAVEファイルのオープンに失敗しました。\n"); waveOutClose(hWaveOut); return 1; } // WAVEファイルのデータ部分へ移動 MMCKINFO mmckinfoParent; memset(&mmckinfoParent, 0, sizeof(MMCKINFO)); mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); result = mmioDescend(hmmio, &mmckinfoParent, NULL, MMIO_FINDRIFF); if (result != MMSYSERR_NOERROR) { printf("WAVEファイルのフォーマットが正しくありません。\n"); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } MMCKINFO mmckinfoChild; memset(&mmckinfoChild, 0, sizeof(MMCKINFO)); mmckinfoChild.ckid = mmioFOURCC('d', 'a', 't', 'a'); result = mmioDescend(hmmio, &mmckinfoChild, &mmckinfoParent, MMIO_FINDCHUNK); if (result != MMSYSERR_NOERROR) { printf("WAVEファイルのデータ部分が見つかりません。\n"); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } // バッファの作成 DWORD bufferSize = mmckinfoChild.cksize; BYTE* buffer = (BYTE*)malloc(bufferSize); if (buffer == NULL) { printf("バッファの作成に失敗しました。\n"); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } // バッファへデータを読み込む result = mmioRead(hmmio, (HPSTR)buffer, bufferSize); if (result != bufferSize) { printf("WAVEファイルのデータの読み込みに失敗しました。\n"); free(buffer); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } // WAVEファイルを再生する WAVEHDR waveHeader; memset(&waveHeader, 0, sizeof(WAVEHDR)); waveHeader.lpData = (LPSTR)buffer; waveHeader.dwBufferLength = bufferSize; result = waveOutPrepareHeader(hWaveOut, &waveHeader, sizeof(WAVEHDR)); if (result != MMSYSERR_NOERROR) { printf("音声データの準備に失敗しました。エラーコード: %d\n", result); free(buffer); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } result = waveOutWrite(hWaveOut, &waveHeader, sizeof(WAVEHDR)); if (result != MMSYSERR_NOERROR) { printf("音声データの再生に失敗しました。エラーコード: %d\n", result); free(buffer); mmioClose(hmmio, 0); waveOutClose(hWaveOut); return 1; } // 再生が終了するまで待機 while (!(waveHeader.dwFlags & WHDR_DONE)) { Sleep(100); } // メモリの解放とファイルのクローズ free(buffer); mmioClose(hmmio, 0); // デバイスのクローズ waveOutClose(hWaveOut); return 0; }