PlaySound
работает отлично, если мне нужен один звуковой сигнал. Следующее иллюстрирует мой фрагмент кода:
PlaySound(TEXT("C:\\Test1.wav"), NULL, SND_ASYNC);
У меня вопрос, как использовать эту функцию дважды или более, так как она воспроизводится только один раз, независимо от количества повторений, которые я собрал. Я также попробовал это:
PlaySound(TEXT("C:\\Test1.wav"), NULL,SND_FILENAME|SND_LOOP|SND_ASYNC);
который воспроизводит звуковой сигнал в непрерывном цикле. Как играть в это дважды или трижды и т. Д.?
Использование цикла тоже не помогает.
Проблема заключается в SND_ASYNC
флаг. Это говорит о том, что вы хотите, чтобы этот вызов немедленно вернулся и воспроизводил звук в фоновом режиме.
Если вы сделаете это в цикле, так как он вернется с воспроизводимым звуком, он будет перекрываться со следующим вызовом и ничего не делать, поскольку приложение IIRC может одновременно выполнить только один вызов PlaySound.
Решение состоит в том, чтобы заменить SND_ASYNC
с SND_SYNC
(или удалите его, так как это по умолчанию). Если вам нужно, чтобы вызов был асинхронным, вы можете создать поток и использовать звуки, которые хотите воспроизвести. Поток будет воспроизводиться синхронно, но другие ваши потоки не заметят.
У вас есть два варианта с этим API. Либо играть синхронно, либо асинхронно.
Если вы играете синхронно, то ваш поток будет блокироваться, пока не закончится воспроизведение звука. Вы можете поместить его в цикл и вызывать его столько раз, сколько захотите, но тогда ваш поток будет блокироваться во время воспроизведения звука.
Если вы играете асинхронно, то ваш поток не будет блокироваться, но у вас нет надежного способа контролировать количество повторений.
Я вижу два решения для вас: либо создать новый звук из оригинала, добавив правильное количество повторов, и воспроизвести его один раз, либо создать фоновый поток для воспроизведения звука указанное количество раз — в этом фоновом потоке вы можете безопасно используйте метод синхронного воспроизведения, как описано выше.