2016-08-22 3 views
0

C++プログラムで.wavファイルを再生する方法を理解するために、PlaySoundのさまざまなサンプルをコピペしています。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; 
} 

** EDIT:あなたの助けをありがとうみんな。これを理解するまでにはしばらく時間がかかりました。ここで

は、私がやったことだ:

1)私は、ルートフォルダ内の.wavファイルを置きました。 2)私はに行ってきました: プロジェクト プロパティ プロジェクトのビルドオプション 検索ディレクトリ リソースコンパイラ

と私は、リソースコンパイラでは、ファイルの場所を置きました。

**

+1

はい、ファイルの場所の問題である可能性があります。 Code :: Blocks **はプロジェクトのルートディレクトリを現在のディレクトリとして実行可能ファイルを実行することを覚えています(または学ぶ!)。 Windowsエクスプローラ(またはLinux Equiv)からexeファイルを実行すると、現在のディレクトリ**のフォルダに**プログラムが実行されます。現在のディレクトリは、ファイルを開くときに使用され、フルパスが指定されていないか、または(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ファイルを置く必要があります(IDEからプログラムを実行する場合、プログラムの現在のパスは少し予期しないことがあります - 実行可能ファイルへのパスではなく、プロジェクトファイルへのパスなど)。