Я пытаюсь воспроизвести песню в простом исполняемом файле консоли. Однако после запуска .exe песня не воспроизводится, и вместо этого появляется циклический звук уведомления Windows. Ресурсы созданы правильно (я использую Codeblocks, поэтому я могу видеть их в /obj/debug/), поэтому я предполагаю, что это потому, что путь PlaySound(), который я установил, не ведет к нужному каталогу.
Как указать путь к ресурсам в функции PlaySound()? заранее спасибо
играть/main.cpp:
#include <iostream>
#include <thread>
#include <windows.h>
#include <mmsystem.h>
void play() {
PlaySound(TEXT("a18.wav"), NULL, SND_FILENAME|SND_LOOP|SND_ASYNC);
}
int main() {
std::thread t(play);
system("pause>>nul");
t.join();
return 0;
}
играть/песня.rc:
song WAVE "/rsrc/a18.wav"
@RetiredNinja Я уже пытался PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE);
, но, как и следовало ожидать, это не сработало. Не могли бы вы объяснить это мне?
Как вы компилируете эту программу? Вы уверены, что ресурсы правильно включены в исполняемый файл? Используя Visual Studio, вы можете открыть исполняемый файл и просмотреть ресурсы. Вы также можете использовать такую программу, как ResourceHacker. angusj.com/resourcehacker Я бы изменил флаги на SND_RESOURCE | SND_NODEFAULT
и проверил возвращаемое значение из PlaySound
. Если это неверно, вы, вероятно, получите ошибку 1812 - 1815, которую вы можете найти здесь: Learn.Microsoft.com/en-us/windows/win32/debug/…
@selbie, может быть, вам нужно обновить страницу, в вопросе есть rc
@RetiredNinja, как я уже сказал, использую компилятор Codeblocks + mingw и уверен, что ресурсы были включены правильно. Извините за глупый вопрос, но я не знал, что, как сказал Реми Лебо, «MAKEINTRESOURCE(IDR_WAVE1)
не будет работать с нечисловыми идентификаторами».
SND_FILENAME
— неправильный флаг для использования, когда аудио находится в ресурсе. Вместо этого вам нужно использовать флаг SND_RESOURCE
.
Показанный вами .rc
присваивает ресурсу нечисловой идентификатор song
, вам нужно использовать этот идентификатор для воспроизведения ресурса. В документации PlaySound есть даже такой пример: Воспроизведение ресурсов WAVE. В комментариях вы говорите, что пытались использовать MAKEINTRESOURCE(IDR_WAVE1)
в качестве идентификатора ресурса для воспроизведения, но MAKEINTRESOURCE()
работает только с числовыми идентификаторами.
Кроме того, вы используете флаг SND_ASYNC
, что означает, что PlaySound()
немедленно завершится, поэтому ваш поток немедленно завершится, что сделает его бесполезным. Вам вообще не нужна нить, если вы не уберете флаг SND_ASYNC
.
Попробуйте это вместо этого:
#include <windows.h>
#include <mmsystem.h>
#include <cstdlib>
int main() {
PlaySound(TEXT("song"), GetModuleHandle(NULL), SND_RESOURCE|SND_LOOP|SND_ASYNC);
std::system("pause>>nul");
PlaySound(NULL, NULL, 0);
return 0;
}
В качестве альтернативы:
#include <thread>
#include <atomic>
#include <cstdlib>
#include <windows.h>
#include <mmsystem.h>
std::atomic_bool stop(false);
void play() {
while (!stop.load()) {
PlaySound(TEXT("song"), GetModuleHandle(NULL), SND_RESOURCE);
}
}
int main() {
std::thread t(play);
std::system("pause>>nul");
stop.store(true);
t.join();
return 0;
}
В документации объясняется, как это сделать, и приводится пример.