2016-08-22 39 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运行程序,程序的当前路径对你来说可能有点意外 - 不是可执行文件的路径,而是通往项目文件的路径或类似的东西)。