Загрузка...

среда, 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_). Если просто создать экземпляр приложения, но не стартовать его, приведенный код выполнится без ошибок, но молча.

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


0 коммент.:

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