среда, 23 ноября 2011 г.

Phonon: Я хочу, чтобы песня звучала

Опыт показывает: пользователь рабочего места, связанного со специфической периферией (автоматизированная касса, испытательный стенд, терминал сбора данных), всегда хочет звукового уведомления о ключевых событиях и нештатных ситуациях. Не миновала чаша сия и меня.

Задача, в общем, тривиальна: хочется, чтобы в определенные моменты программа издавала определенный звук. Какой именно звук, должно настраиваться, но это непринципиально.

Так как разработка ведется на Python/PyQt, в качестве звукоиздавателя естественным образом напросился Phonon, ибо кроссплатформенный и уже есть в PyQt (в проекте не появляются лишние зависимости)

Мало почитав доку и погуглив, родил простенький класс:
from PyQt4.phonon import Phonon

class SimpleSound(object):
    u"""Проигрывает аудиофайл"""

    def __init__(self):
        self._audioout = Phonon.AudioOutput(Phonon.NotificationCategory)
        self._sound = Phonon.MediaObject()
        Phonon.createPath(self._sound, self._audioout)

    def play(self, fname):
        self._sound.setCurrentSource(Phonon.MediaSource(fname))
        self._sound.play()

Использовать, так:
sound = SimpleSound()
sound.play(u'notify.wav')

Естественно, объект SimpleSound достаточно создать один раз и повсеместно использовать. Для проигрывания единственного файла можно было обойтись и без класса, простым кодом:
sound = Phonon.createPlayer(Phonon.NotificationCategory, Phonon.MediaSource(u'notify.wav'))
sound.play()

Но для проигрывания разных файлов для разных ситуаций это несколько неудобно.

Для корректного создания объектов Phonon должен существовать экземпляр QApplication. Есть еще нюанс: весь этот код работает только внутри цикла обработки сообщений приложения (когда выполняется QApplication.exec_). Если просто создать экземпляр приложения, но не стартовать его, приведенный код выполнится без ошибок, но молча.

Приятного прослушивания.


Комментариев нет:

Отправить комментарий