OpenAL: ошибка AL_INVALID_VALUE при использовании alBufferData () для загрузки файла WAVE - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь использовать 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);
...