Как воспроизводить звук в Python БЕЗ прерывания музыки / других звуков при воспроизведении - PullRequest
7 голосов
/ 24 января 2010

Я работаю над таймером в python, который подает звуковой сигнал, когда время ожидания истекло. Я использую следующий код:

from wave import open as wave_open
from ossaudiodev import open as oss_open

def _play_chime():
    """
    Play a sound file once.

    """
    sound_file = wave_open('chime.wav','rb')
    (nc,sw,fr,nf,comptype, compname) = sound_file.getparams( )
    dsp = oss_open('/dev/dsp','w')
    try:
      from ossaudiodev import AFMT_S16_NE
    except ImportError:
      if byteorder == "little":
        AFMT_S16_NE = ossaudiodev.AFMT_S16_LE
      else:
        AFMT_S16_NE = ossaudiodev.AFMT_S16_BE
    dsp.setparameters(AFMT_S16_NE, nc, fr)
    data = sound_file.readframes(nf)
    sound_file.close()
    dsp.write(data)
    dsp.close()

Работает довольно хорошо, если только другое устройство не выводит звук.

Как я могу сделать в основном то же самое (под Linux), не имея предпосылки, что звук не воспроизводится?

Если вы считаете, что для этого процесса потребуется API, обеспечивающий смешивание программного обеспечения, предложите метод:)

Спасибо за поддержку:)

Ответы [ 2 ]

8 голосов
/ 24 января 2010

Простой ответ: «Переключитесь с OSS на PulseAudio». (Или настройте ALSA для использования dmix, или получите звуковую карту с лучшими драйверами Linux ...)

Более сложный ответ: ваш код уже работает так, как вы хотите ... на некоторых звуковых картах. Драйверы OSS могут предоставлять аппаратные микшеры, чтобы вы могли воспроизводить одновременно несколько аудиопотоков, или они могут представлять один поток, что приводит к блокировке звука, который вы видите в вашей системе. Единственное правильное решение - использовать API, обеспечивающий микширование программного обеспечения.

1 голос
/ 24 января 2010

Современное оборудование и драйверы поддерживают несколько потоков. Поэтому, если вы не используете устаревшее оборудование или дрянной драйвер, он все равно должен работать.

Сказав это, ALSA может дать вам больше контроля, чем OSS. Большинство ядер, поставляемых в настоящее время, поддерживают оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...