2016-08-22 25 views
0

我是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)我去: 項目 屬性 項目的構建選項 搜索目錄 資源編譯器

和我放在資源編譯器的文件的位置。

**

+1

是的,它可能是一個文件位置問題。請記住(或者學習!)Code :: Blocks **將項目根目錄下的可執行文件作爲當前目錄**運行。從Windows資源管理器(或者linux equiv)運行一個exe文件,將**文件夾作爲當前目錄**運行該程序。打開文件時使用當前目錄,並且(0)未指定完整路徑或(1)未指定相對路徑。 – enhzflep

+0

另外,WAV格式非常簡單,如果你讀過Petzold的書,你會發現使用聲音硬件非常簡單。大約200行代碼允許您從磁盤讀取文件並將它自己發送到聲卡。當然,你比PlaySound提供的更好的控制。例如,可以播放磁盤上不存在的聲音,或加快/減慢播放速度。錄製音符,然後改變播放速度改變音調(不幸的是,持續時間)。伴隨着聲音的樂趣很多。 :) – enhzflep

回答

0

。在你的代碼進行檢查:

ifstream infile(filename, ios::binary); 
if (!infile) 
{ 
    std::cout << "Wave::file error: " << filename << std::endl; 
    return; 
} 

所以,看來問題很簡單:未找到文件。這意味着這個問題不是關於PlaySound,而是關於打開文件。你需要使用完整路徑(類似於Wave one("c:\\project\\drake.wav");),或者把wav-file放在程序的目錄中(如果你從IDE運行程序,程序的當前路徑對你來說可能有點意外 - 不是可執行文件的路徑,而是通往項目文件的路徑或類似的東西)。