我是copypasting,然後修改PlaySound的各種示例,以弄清楚如何在C++程序中播放.wav文件。Playsound in C++:文件錯誤與.wav文件
現在我有一個看起來比任何其他工作更多,但是當文件執行它不會播放.wav文件,並在窗口內告訴我有一個與.wav文件錯誤文件。
重申:程序的構建和運行沒有問題。錯誤出現在正在運行的程序中。我無法弄清楚問題所在。難道它只是一個位置問題?
錯誤說:「波::文件錯誤:drake.wav」
我已經設置了SDL,雖然它可能我已經做了不正確。我在Lazyfoo上使用了指南。我正在使用Codeblocks和MinGW。
下面的代碼,我發現here:
#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)我去: 項目 屬性 項目的構建選項 搜索目錄 資源編譯器
和我放在資源編譯器的文件的位置。
**
是的,它可能是一個文件位置問題。請記住(或者學習!)Code :: Blocks **將項目根目錄下的可執行文件作爲當前目錄**運行。從Windows資源管理器(或者linux equiv)運行一個exe文件,將**文件夾作爲當前目錄**運行該程序。打開文件時使用當前目錄,並且(0)未指定完整路徑或(1)未指定相對路徑。 – enhzflep
另外,WAV格式非常簡單,如果你讀過Petzold的書,你會發現使用聲音硬件非常簡單。大約200行代碼允許您從磁盤讀取文件並將它自己發送到聲卡。當然,你比PlaySound提供的更好的控制。例如,可以播放磁盤上不存在的聲音,或加快/減慢播放速度。錄製音符,然後改變播放速度改變音調(不幸的是,持續時間)。伴隨着聲音的樂趣很多。 :) – enhzflep