2016-08-22 14 views
0

Я копирую, а затем перебираю различные примеры PlaySound, чтобы выяснить, как играть в WAV-файл в программе на C++.Playsound в C++: Ошибка файла с .wav-файлом

Прямо сейчас у меня есть тот, который работает больше, чем любой другой, но когда файл выполняет его, он не воспроизводит .wav-файл и внутри окна он сообщает мне, что есть ошибка файла с .wav файл.

Повторить: программа создает и запускает никаких проблем. В запущенной программе появляется ошибка. Я не могу понять, в чем проблема. Может ли это быть проблемой местоположения?

Ошибка говорит: «Wave :: Ошибка файла: 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 ** запускает ваш исполняемый файл с корневым каталогом проекта в качестве текущего каталога **. Запуск exe из Windows Explorer (или linux equiv) запускает программу с ** ее папкой в ​​качестве текущего каталога **. Текущий каталог используется при открытии файла, и вы либо (0) не указали полный путь, либо (1) не указали относительный путь. – enhzflep

+0

Кроме того, формат WAV довольно прост и, если вы прочитали книгу Петцольда, вы увидите, что использование звукового оборудования довольно прямолинейно. Примерно в 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, текущий путь к программе может быть немного неожиданным для вас - не путь к исполняемому файлу, а путь к файлу проекта или что-то вроде этого).

 Смежные вопросы

  • Нет связанных вопросов^_^