Я пытаюсь использовать OpenAL для воспроизведения файла WAVE.Я загружаю содержимое файла в динамически размещенный массив const unsigned char*
.но когда я пытаюсь загрузить указанный массив, используя alBufferData()
, я получаю ошибку AL_INVALID_VALUE
.
alBufferData(
this->buffer_id_, //id :218892368
this->format_, //format :AL_FORMAT_STEREO16
this->data_buffer_ptr_, //data :0x0d756040""
this->data_buffer_size_,//data size :17992800
this->frequency_ //frequency :44100
);
CheckForALError(); //Prints error: AL_INVALID_VALUE
Согласно документации эта ошибка возникает, когда " Параметр размера недопустим для форматауказан, буфер используется или данные имеют нулевой указатель.".Я подтвердил, что размер соответствует ожидаемому (около 17,1 МБ) и что указатель не равен NULL.Однако указатель, похоже, указывает на местоположение, содержащее группу \0
: s, что немного странно.Я ожидал бы больше других значений, так как именно здесь я считаю, что я загрузил свой .wav
-файл.
Моя проблема в том, что я не знаю, заключается ли ошибка в том, как я обрабатываю вызовы OpenAL или вкак я загружаю свой файл WAVE.
Ниже приведены два довольно здоровенных блока кода, в которых я определяю объекты Source и Buffer в OpenAL и загружаю мой файл WAVE.
//------------------------------------------------------//
//---------------------SOURCE SETUP---------------------//
//------------------------------------------------------//
//Generate one (1) source for this id
alGenSources((ALuint)1, &this->source_id_);
//Set position
alSource3f(this->source_id_, AL_POSITION, this->pos_.x, this->pos_.y, this->pos_.z);
CheckForALError();
//SetVelocity
alSource3f(this->source_id_, AL_VELOCITY, 0.0f, 0.0f, 0.0f);
CheckForALError();
//Set pitch
alSourcef(this->source_id_, AL_PITCH, 1);
CheckForALError();
//Set gain
alSourcef(this->source_id_, AL_GAIN, 1);
CheckForALError();
//Set if this audio source should loop
alSourcei(this->source_id_, AL_LOOPING, this->loop_);
CheckForALError();
//------------------------------------------------------//
//---------------------BUFFER SETUP---------------------//
//------------------------------------------------------//
//Generate one (1) buffer
alGenBuffers((ALuint)1, &this->buffer_id_);
CheckForALError();
//Load the WAVE file
this->LoadWAVEFile(wav_path);
//Link source and buffer
alSourcei(this->source_id_, AL_BUFFER, this->buffer_id_);
CheckForALError();
Вот гдеЯ загружаю файл WAVE (Содержимое функции LoadWAVEFile()
):
FILE* file_ptr = nullptr;
errno_t error;
error = fopen_s(&file_ptr, wav_path, "rb");
//Variables for storing file information
char file_type[4];
DWORD file_size;
DWORD chunk_size;
short format_type;
short channels;
DWORD sample_rate;
DWORD avg_bytes_per_sec;
short bytes_per_sample;
short bits_per_sample;
DWORD data_size;
//Confirm that the file is of the right format
//RIFF : 12 Bytes
//fmt : 24 Bytes
//data : 8 + <data size>
//------------------------------------------------------//
//----------------------'RIFF' PART---------------------//
//------------------------------------------------------//
//Check for RIFF
fread(file_type, sizeof(char), 4, file_ptr); //sizeof(char)*4 = 4 bytes
//Check for WAV
fread(&file_size, sizeof(DWORD), 1, file_ptr); //sizeof(DWORD)*1 = 4 bytes
fread(file_type, sizeof(char), 4, file_ptr); //sizeof(char) * 4 = 4 bytes
//Total: 12 bytes
//------------------------------------------------------//
//---------------------'fmt ' PART----------------------//
//------------------------------------------------------//
//Check for fmt
fread(file_type, sizeof(char), 4, file_ptr); //sizeof(char)*4 = 4 bytes
//Fill some of the file variables
fread(&chunk_size, sizeof(DWORD), 1, file_ptr); //sizeof(DWORD)*1 = 4 bytes
fread(&format_type, sizeof(short), 1, file_ptr); //sizeof(short)*1 = 2 bytes
fread(&channels, sizeof(short), 1, file_ptr); //sizeof(short)*1 = 2 bytes
fread(&sample_rate, sizeof(DWORD), 1, file_ptr); //sizeof(DWORD)*1 = 4 bytes
fread(&avg_bytes_per_sec, sizeof(DWORD), 1, file_ptr); //sizeof(DWORD)*1 = 4 bytes
fread(&bytes_per_sample, sizeof(short), 1, file_ptr); //sizeof(short)*1 = 2 bytes
fread(&bits_per_sample, sizeof(short), 1, file_ptr); //sizeof(short)*1 = 2 bytes
//Total: 24 bytes
//------------------------------------------------------//
//---------------------'data' PART----------------------//
//------------------------------------------------------//
//Check that we have reached the sound data
fread(file_type, sizeof(char), 4, file_ptr); //sizeof(char)*4 = 4 bytes
//Check data size
fread(&data_size, sizeof(DWORD), 1, file_ptr); //sizeof(DWORD)*1 = 4 bytes
//Allocate memory and read sound data
this->data_buffer_ptr_ = new unsigned char[data_size];
size_t read_values = fread(this->data_buffer_ptr_, sizeof(BYTE), data_size, file_ptr);
//sizeof(BYTE)*data_size = <data size>
//Total: 8 + <data size>
//------------------------------------------------------//
//-------------------OTHER STUFF PART-------------------//
//------------------------------------------------------//
//Set frequency and data buffer size
this->frequency_ = sample_rate;
this->data_buffer_size_ = data_size;
//Identify format (NTS: The if-cases are sub-optimal, yes, but they give me better oversight)
if (bits_per_sample == 8 && channels == 1) { this->format_ = AL_FORMAT_MONO8; }
else if (bits_per_sample == 8 && channels == 2) { this->format_ = AL_FORMAT_STEREO8; }
else if (bits_per_sample == 16 && channels == 1) { this->format_ = AL_FORMAT_MONO16; }
else if (bits_per_sample == 16 && channels == 2) { this->format_ = AL_FORMAT_STEREO16; }
//Close file stream
fclose(file_ptr);