Как воспроизвести звук на двух разных DOSBox одновременно?

Я создал игру "Angry Birds" в сборке 8086. Моя главная проблема сейчас в том, что я хочу играть песню игры, пока работает основной цикл. Я уже написал код для музыки. Я думал об использовании многопоточности, но обнаружил, что прерывание сборки для создания потоков работает только в cmd, а не в DOSBox.

Однако я нашел другой способ реализации многопоточности, который заключался в вызове команды из файла C++ Windows.h, которая создает поток. Это было слишком сложно.

Теперь мне удалось установить связь между двумя разными окнами DOSBox, используя прерывание 14h для отправки сообщений через порты LAN. По сути, я написал отдельный код для музыки. Оба кода работают, и только когда музыкальный код получает знак, он начинает играть музыку.

Однако обнаружил, что при открытых двух окнах DOSBox работает звук только основного. Вы должны переключать окна, чтобы услышать музыку, а это значит, что вы ее не слышите.

Кто-нибудь знает, как я могу решить эту проблему или вообще воспроизводить музыку во время работы основного цикла?

Спасибо


person Boomer    schedule 08.05.2019    source источник
comment
понятия не имею об ответе, но +1 от меня за решимость и настойчивость :)   -  person tum_    schedule 08.05.2019
comment
Вам не нужно создавать еще один поток (что является концепцией ОС) для воспроизведения музыки. SoundBlaster и аналогичные устройства поддерживают DMA. Кроме того, игры обычно управляются прерываниями, поэтому в конечном итоге вы можете воспроизводить музыку в основном потоке.   -  person Margaret Bloom    schedule 08.05.2019
comment
Из любопытства, какой механизм вы используете для воспроизведения звука? Через динамик ПК (симулируется в DOSBox) или через какую-нибудь звуковую карту типа Soundblaster (симулируется в DosBOX) или еще как?   -  person Michael Petch    schedule 08.05.2019
comment
Код может подключиться к прерыванию таймера 0 (INT 08) и изменить частоту на более высокую. Чтобы системное время было правильным, код, на который указывает INT 08, должен вызываться один раз каждые 65536 циклов = 54,925 мс. Код также может создать мини-многопоточное ядро ​​и использовать его.   -  person rcgldr    schedule 08.05.2019
comment
В DOSBOX может быть возможность включить звук, даже если он находится в фоновом режиме. Вероятно, он намеренно отключает звук. Если нет опции конфигурации, DOSBOX имеет открытый исходный код, поэтому вы можете добавить ее. (Если вы действительно хотите, чтобы эта идея с удаленным звуковым сервером работала вместо использования прерывания по таймеру + микширования звука внутри одной программы, чтобы она могла работать на одном (виртуальном) однопроцессорном ПК!)   -  person Peter Cordes    schedule 09.05.2019
comment
Я хотел бы сыграть в эту игру.   -  person the kamilz    schedule 09.05.2019


Ответы (1)


Как уже упоминалось, вы можете использовать многоканальное звуковое устройство (не указанное в вопросе, см. документацию по звуковому чипу (ам) для этого), но выход динамика DOS на основе ШИМ представляет собой выход одной формы волны без понятия второй частоты, если вы не хотите цифровое объединение сигналов ШИМ и вывод объединенных данных (будет неприятная работа, возможно, десятки микросекунд между фронтами, которые вам придется обрабатывать вручную. DMA должен работать, но буферы, вероятно, будут большими, что означает, что задержка звука будет составлять много миллисекунд.

person Hans Schulze    schedule 31.12.2019
comment
Windows, вероятно, имитирует звуковое устройство через перевод API в HW. Не уверен, насколько сложно будет туда добраться. - person Hans Schulze; 25.03.2021