Функция PlaySound() из WinAPI

Здравствуйте.
Пишу игру. Понадобилось воспроизвести звук. Пытаюсь воспроизвести звук функцией PlaySound(), но так, что бы не остановилось выполнение программы. Пишу так:


#include <iostream>

using namespace std;

#include <windows.h>

int main() 
{   
    PlaySound( "1.wav", NULL, SND_ASYNC | SND_FILENAME );
    cout << "There" << endl;
        Sleep( 1000 );
    return 0;
}

Вот ссылка на описание функции в MSDN.

Работаю в devcpp 5.4.2.
Во вкладке Сервис->Параметры компилятора->добавить эти команды к командной строке компоновщика приписал winmm.lib. В результате линковщик выдаёт ошибку:

main.o  main.cpp:(.text+0x2e): undefined reference to `_imp__PlaySoundA@12'

Что я делаю не так?

Что я делаю не так?

Используешь неправильный компилятор. В MS Windows есть только один правильный компилятор — MS VC++ :-)

А если серьезно то в Dev-C++ добавлять winmm.lib надо в Параметрах проекта на вкладке Параметры, нажав кнопку Добавить библиотеку. В открывшемся окошке надо найти и выбрать файл winmm.lib.

Только winmm.lib не входит в поставку MinGW. Если у тебя установлена Visual Studio, то ищи в C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64/.

Используешь неправильный компилятор. В MS Windows есть только один правильный компилятор — MS VC++ :-)

А чем вам gcc не угодил?

Кстати, спасибо, добавил библиотеку libwinmm.a в параметрах проекта и всё компилировалось, правда звук всё равно не воспроизводится :(

А чем вам gcc не угодил?

Мне то пофиг. Это вам звук из программы нужен ))

Вот такая программка (узнаешь?) под MS VC++ скомпилировалась и работает «на ура»:

#include <iostream>

using namespace std;

#include <windows.h>

int main() 
{   
    //PlaySound( L"1.wav", NULL, SND_ASYNC | SND_FILENAME );
    PlaySound(TEXT("SystemStart"), NULL, SND_ALIAS);
    cout << "There" << endl;
        Sleep( 1000 );
    return 0;
}

Если теперь у тебя программа все-таки компилируется, то может она файл со звуком не находит? Кстати PlaySound возвращает булево значение. Проверять не пробовал?

Да, еще... Если для gcc в проекте прикрутить winmm.lib от Вижуал студии, то тоже все работает. С libwinmm.a не пробовал — у меня нет такой либы.

Кстати PlaySound возвращает булево значение. Проверять не пробовал?

Функция не работает, но возвращает не нулевое значение.
Вот код:

#include <iostream>

using namespace std;

#include <windows.h>

int main() 
{   
    if ( !PlaySound("1.wav",0,SND_ASYNC | SND_FILENAME) )
        cout << "Error PlaySound()!" << endl;

    cout << "There" << endl;
    Sleep( 1000 );
    return 0;
}

Сообщение об ошибке ни разу не выводится, зато PlaySound() воспроизводит SND_NODEFAULT.
Вот что по этому поводу написано в MSDN:

If the function cannot find the specified sound and the SND_NODEFAULT flag is not specified, PlaySound uses the default system event sound instead. If the function can find neither the system default entry nor the default sound, it makes no sound and returns FALSE.

Если я правильно понял, то в случае неудачи PlaySound() попытается воспроизвести как раз этот самый SND_NODEFAULT и возвратит FALSE если и это не возможно.

Я в отчаянии :(

Где лежит твой файл «1.wav»?

файл лежит в текущей директории( папка с exe-шником )

В MSVS пробовал компилить?

MSVS не держу на своём компе, поскольку недолюбливаю сие творение.

UPD

Попробовал в MSVS, результат тот же

P.S. Попробуй sleep сделать больше, либо вызвать функцию в синхронном режиме. Возможно, оно не успевает подгрузить звук в память и воспроизвести его за 1 секунду.

файл лежит в текущей директории( папка с exe-шником )

если запускаете из среды студии, то ложите файл в одну папку с проектом.

Всё, проблема решена :)
Помогло это:

sleep сделать больше

Оказывается, первые 1-1.5 секунды музыки были пустые. Ну и дурак же я :)

Всём спасибо

С чувством юмора — плохо, даже несмотря на смайлик (((

Тогда давайте скучно и по делу.

а) Видимо из всех присутствующих только у меня данный код работает:

#include <iostream>

using namespace std;

#include <windows.h>

int main() 
{   
    PlaySound( "1.wav", NULL, SND_ASYNC | SND_FILENAME );
    cout << "There" << endl;
    Sleep( 10000 );  // 10 sec
    PlaySound( NULL, NULL, SND_FILENAME );
    return 0;
}

б) Работает при компиляции в Dev-C++/gcc (TDM-GCC 4.8.1 64-bit), и при компиляции в MS Visual Studio 2012.

в) В обоих случаях использую библиотеку от Microsoft C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/x64/WinMM.lib. Обращаем внимание, что для компиляции в x64 используем либу x64 (для x32 — соответственно).

г) Удостоверяемся, что wav имеет правильный формат (а не, допустим, mp3, который сконвертировали в wav путем переименования файла).

Видимо из всех присутствующих только у меня данный код работает:

Нет, у меня тоже работает.

Видимо из всех присутствующих только у меня данный код работает

мечтать не вредно )))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.