2016-08-22 2 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; 
} 

** 편집 : 당신의 도움을 주셔서 감사합니다 여러분. 이것을 이해하는 데는 시간이 걸렸습니다.

는 여기에 내가했던 일이야 :

1) 나는 루트 폴더 안에 .wav 파일을 배치. 2) 나는 갔다 : 프로젝트 속성 프로젝트의 빌드 옵션 검색 디렉토리 리소스 컴파일러

나는 리소스 컴파일러에서 파일의 위치를 ​​배치했다. 파일을 찾을 수 없습니다

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

그래서,이 문제는 간단한 것 같다 :

**

+1

예, 파일 위치 문제 일 수 있습니다. Code :: Blocks **는 프로젝트의 루트 디렉토리를 현재 디렉토리로 사용하여 실행 파일을 실행한다는 것을 기억하십시오 (또는 배우십시오!). Windows 탐색기 (또는 Linux Equiv)에서 exe를 실행하면 프로그램이 ** 현재 디렉토리 **의 폴더로 실행됩니다. 현재 디렉토리는 파일을 열 때 사용되며 사용자는 (0) 전체 경로를 지정하지 않았거나 (1) 상대 경로를 지정하지 않았습니다. – enhzflep

+0

또한 WAV 형식은 매우 간단하며 Petzold의 책을 읽었다면 사운드 하드웨어를 사용하는 것이 상당히 간단하다는 것을 알 수 있습니다. 약 200 줄의 코드를 사용하여 디스크에서 파일을 읽고 사운드 카드로 직접 보낼 수 있습니다. 당연히 PlaySound가 제공하는 것보다 더 많은 제어력을 확보하고 있습니다. 예를 들어, 디스크에 존재하지 않는 사운드를 재생하거나 재생 속도를 높이거나 낮추는 기능. 음표를 녹음 한 다음 재생 속도를 변경하면 피치가 변경됩니다 (불행하게도 음장 길이도 불편 함). :) – enhzflep

답변

0

코드에서 검사가있다. 이 질문은 PlaySound에 관한 것이 아니라 파일 열기에 관한 것입니다.

전체 경로 (예 : Wave one("c:\\project\\drake.wav");)를 사용하거나 프로그램의 디렉토리에 wav 파일을 넣어야합니다 (프로그램의 현재 경로가 약간 예상치 못한 경우 일 수 있습니다. 실행 파일에 대한 경로가 아니라 프로젝트 파일이나 이와 유사한 경로).