3 * @brief Windows版固有実装(WAVファイル読込)
6 #include "main-win/wav-reader.h"
7 #include "main-win/main-win-utils.h"
9 bool wav_reader::open(char *filename)
13 this->hmmio = ::mmioOpenW(to_wchar(filename).wc_str(), NULL, MMIO_READ);
14 if (this->hmmio == NULL) {
22 this->riff_chunk.fccType = mmioFOURCC('W', 'A', 'V', 'E');
23 mmresult = ::mmioDescend(this->hmmio, &this->riff_chunk, NULL, MMIO_FINDRIFF);
24 if (mmresult != MMSYSERR_NOERROR) {
28 this->fmt_chunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
29 mmresult = ::mmioDescend(this->hmmio, &this->fmt_chunk, &this->riff_chunk, MMIO_FINDCHUNK);
30 if (mmresult != MMSYSERR_NOERROR) {
34 if (this->fmt_chunk.cksize > sizeof(this->waveformatex)) {
37 read_size = this->fmt_chunk.cksize;
38 readed_size = ::mmioRead(this->hmmio, (HPSTR) & this->waveformatex, read_size);
39 if (readed_size != read_size) {
42 if (this->waveformatex.wFormatTag != WAVE_FORMAT_PCM) {
45 mmresult = ::mmioAscend(this->hmmio, &this->fmt_chunk, 0);
46 if (mmresult != MMSYSERR_NOERROR) {
50 this->data_chunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
51 mmresult = ::mmioDescend(this->hmmio, &this->data_chunk, &riff_chunk, MMIO_FINDCHUNK);
52 if (mmresult != MMSYSERR_NOERROR) {
56 this->buffer.reset(new BYTE[data_chunk.cksize]);
57 read_size = this->data_chunk.cksize;
58 readed_size = ::mmioRead(this->hmmio, (HPSTR)this->buffer.get(), read_size);
59 if (readed_size != read_size) {
66 BYTE *wav_reader::read_data()
68 return this->buffer.release();
71 void wav_reader::close()
73 if (this->hmmio != NULL) {
74 ::mmioClose(this->hmmio, 0);