Поскольку я впервые использую эту функцию (я очень ранний новичок, начал писать код на c ++ три месяца назад), я хотел попробовать ее с разной степенью успеха: в основном, моя проблема заключается в том, что через моя программа, я начинаю с использованием функции PlaySound () следующим образом:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Как видите, файл является ресурсом, который я непосредственно включил в свой проект с VS2017. Но проблема не в этом, так как звук сам по себе играет нормально.
Проблема возникает, когда я пытаюсь остановить этот звук и воспроизвести другую песню (также в ресурсах моего проекта). Вот как я это сделал:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Sleep(2000);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Вот как я тестировал то, что работает PlaySound, но в основном это то, как функция воспроизведения звука называется в моей программе несколько раз. Проблема в том, что когда я запускаю это, он компилируется, но дает ошибка нарушения доступа к памяти (по-французски, извините).
Поэтому я попытался сначала остановить первый проигрываемый звук, а затем воспроизвести второй, например так:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Sleep(2000);
PlaySound(NULL, NULL, SND_ASYNC);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
но я все еще получил ту же ошибку. Наконец, я возился и обнаружил, что добавление флага SND_NOSTOP выглядит так:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC);
Sleep(2000);
PlaySound(NULL, NULL, SND_ASYNC);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2), NULL, SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP);
не вызвал ошибку и работает нормально, но вторая песня никогда не играет, и нет звука.
В заключение я хотел бы добавить, что я попытался поменять местами IDR_WAVE1 и IDR_WAVE2, и это работает как раз с взаимозаменяемыми песнями, так что это (вероятно?) Здесь не является причиной.
Спасибо за чтение !
Благодаря @TedLyngmo я прочитал руководство и использовал приведенные примеры для рабочего кода:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC);
PlaySound(NULL, 0, 0);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2), GetModuleHandle(NULL), SND_RESOURCE | SND_LOOP | SND_ASYNC | SND_NOSTOP);
Задача ещё не решена.
Других решений пока нет …