Я пытаюсь заставить OpenAL воспроизводить простой аудиоклип для игрового движка.Мне не удалось найти хорошую библиотеку для обработки WAV-файлов, поэтому я решил попробовать и декодировать их сам.У меня были некоторые проблемы с этим, и я переписываю свой вопрос, чтобы получить более целенаправленный ответ.
Вот мой код, который обрабатывает WAV-файл.Этот код специально пропускает дополнительные метаданные заголовка, которые, как я обнаружил, вызывают у меня некоторые проблемы.Затем я сохраняю данные в буфере, который возвращается к вызову, который затем отправляет звук в OpenAL.
in.read(buffer, 4);//"data" chunk.
while(strncmp(buffer, "data", 4) != 0)
{
if(strncmp(buffer, "LIST", 4) == 0)
{
in.read(buffer, 2);
in.ignore(ConvertToInt(buffer, 2) - 1);
}
in.read(buffer, 4);
}
std::cout << "current place: " << buffer[0] << buffer[1] << buffer[2] << buffer[3] << std::endl;
in.read(buffer, 4); //Get size of the data
size = ConvertToInt(buffer, 4);
std::cout << "size: " << size << std::endl;
if(size < 0)
{
std::cout << "Error here, not a valid WAV file, size of file reports 0.\n This was found instead: "
<< size << std::endl;
}
char* data = new char[size];
in.read(data, size);//Read audio data into buffer, return.
in.close();
return data;
Вот моя проблема.Музыка не играет.Все, что я получаю, - это очень краткий писк, а затем, когда я убиваю программу, я слышу, как издаются мои динамики.Когда я распечатываю данные, я вижу что-то очень интересное, что заставляет меня думать, что что-то сломано:
Print out data from caller -------------------------------------------------------
8 * É k F < t Å C ═ ) ç ⌠ < º é σ J α 6 * 2 » ² B ë · ² 7 ≈ ≥ · É ⌠ F ∙ ` ≤ t ° y ⌠ 3 ∙ t ÷ i · ≈ ° ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
Я установил программу под названием riffpad и использовал ее, чтобы взглянуть на файл WAV, исначала сопоставляется немного данных, но потом все превращается в знаки равенства, что кажется неправильным.Я не уверен, почему это происходит.Я подумал, что, может быть, это из-за того, как они были возвращены, но эта распечатка - откуда данные создаются, а не где они используются, и они выглядят одинаково в обоих местах.Кто-нибудь знает, что я здесь делаю не так?
Обновление:
Вывод файла целиком приводит к выводу:
Print out data from caller -------------------------------------------------------
R I F F ~ 4 ü W A V E f m t D ¼ ▒ L I S T R I N F O I A R T K o m i k u I C M T í U R L : h t t p : / / f r e e m u s i c a r c h i v e . o r g / m u s i c / K o m i k u / C a p t a i n _ G l o u g l o u s _ I n c r e d i b l e _ W e e k _ S o u n d t r a c k / S k a t e
C o m m e n t s : h t t p : / / f r e e m u s i c a r c h i v e . o r g /
C u r a t o r :
C o p y r i g h t : I C R D 2 0 1 8 - 0 7 - 1 4 T 0 4 : 3 7 : 0 5 I G N R E l e c t r o n i c I N A M S k a t e I P R D . C a p t a i n G l o u g l o u ' s I n c r e d i b l e W e e k S o u n d t r a c k I P R T 4 I S F T L a v f 5 8 . 2 7 . 1 0 3 d a t a 3 ü 8 * É k F < t Å C ═ ) ç ⌠ < º é σ J α 6 * 2 » ² B ë · ² 7 ≈ ≥ · É ⌠ F ∙ ` ≤ t ° y ⌠ 3 ∙ t ÷ i · ≈ ° · ≈ ° ⁿ ╜ ⁿ ▐ ú H : Ü ┴ _ 1 l ß ∩ ≈ / 2 r ó ≡ U ¥ C W 4 : ¬ r G ƒ å Γ ─ 1 ∞ π ╓ z ▒ ò ∞ é > ╣ ô J
┌ ] i
, который выглядит мне как правильный тип данных ... Я в полномпотеря здесь.Что-то о попытке прочитать данные из моего маркера данных в мой размер повреждает данные.