Я копирую, а затем работаю с различными примерами PlaySound, чтобы выяснить, как воспроизвести файл .wav в программе на C ++.
Прямо сейчас у меня есть тот, который, кажется, работает больше, чем любой другой, но когда файл выполняется, он не воспроизводит файл .wav, и внутри окна он говорит мне, что в файле .wav есть ошибка файла.
Повторим: программа собирается и запускается без проблем. Именно в работающей программе появляется ошибка. Я не могу понять, в чем проблема. Может ли это быть просто проблемой местоположения?
Ошибка говорит: «Wave :: file error: drake.wav»
Я настроил SDL, хотя возможно, что сделал это неправильно. Я использовал руководство на Lazyfoo. Я использую Codeblocks и MinGW.
Вот код, который я нашел Вот:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
class Wave {
public:
Wave(char * filename);
~Wave();
void play(bool async=true);
bool isok();
private:
char * buffer;
bool ok;
HINSTANCE HInstance;
};
Wave::Wave(char * filename)
{
ok = false;
buffer = 0;
HInstance = GetModuleHandle(0);
ifstream infile(filename, ios::binary);
if (!infile)
{
std::cout << "Wave::file error: " << filename << std::endl;
return;
}
infile.seekg (0, ios::end);
int length = infile.tellg();
buffer = new char[length];
infile.seekg (0, ios::beg);
infile.read (buffer, length);
infile.close();
ok = true;
}
Wave::~Wave()
{
PlaySound(NULL, 0, 0);
delete [] buffer;
}
void Wave::play(bool async)
{
if (!ok)
return;
if (async)
PlaySound(buffer, HInstance, SND_MEMORY | SND_ASYNC);
else
PlaySound(buffer, HInstance, SND_MEMORY);
}
bool Wave::isok()
{
return ok;
}
int main(int argc, char *argv[]) {
std::cout << "Trying to play sound...\n";
Wave one("drake.wav");
one.play();
std::cout << "press key to exit";
getch();
return 0;
}
** РЕДАКТИРОВАТЬ: Спасибо всем за вашу помощь. Мне понадобилось время, чтобы понять это.
Вот что я сделал:
1) Я поместил файл .wav в корневую папку.
2) Я пошел в:
проект
свойства
Параметры сборки проекта
Поиск в каталогах
Ресурсный Компилятор
и я поместил расположение файла в компилятор ресурсов.
**
В вашем коде есть проверка:
ifstream infile(filename, ios::binary);
if (!infile)
{
std::cout << "Wave::file error: " << filename << std::endl;
return;
}
Итак, похоже, что проблема проста: файл не найден. Это означает, что этот вопрос не о PlaySound
, но об открытии файла.
Вам нужно использовать полный путь (что-то вроде Wave one("c:\\project\\drake.wav");
) или поместите wav-файл прямо в каталог программы (если вы запускаете программу из IDE, текущий путь к программе может быть немного неожиданным для вас — не путь к исполняемому файлу, а путь к файлу проекта или как то так).
Других решений пока нет …