Как сохранить скрипт Python открытым, пока какой-то код на C выполняет какой-то поток? - PullRequest
0 голосов
/ 23 февраля 2011

Я пытаюсь добавить неблокирующий аудио ввод / вывод в pyAudio.

pyAudio использует PortAudio для ввода / вывода звука. Чтобы сделать неблокирующее аудио в PortAudio, вы определяете функцию обратного вызова при открытии аудиопотока. Когда аудиопоток запускается, он вызывает функцию обратного вызова всякий раз, когда требуются новые аудиоданные.

Эта часть работает. Чтобы проверить это, я написал простой скрипт, который реализует функцию обратного вызова, похожую на эту:

def pyAudioCallback(frameCount,inADCtime,curTime,outADCtime,userData,inp = None):
    data=getData(frameCount)
    return (data,0)

Этот обратный вызов вызывается всякий раз, когда аудиопотоку нужны новые аудиосэмплы. Однако сценарий не знает, что аудиопоток все еще работает, и завершается всякий раз, когда это делается, что, конечно, также завершает аудиопоток.

Я могу обойти эту проблему, вставив куда-нибудь time.sleep(). Воспроизведение аудио будет работать нормально, пока скрипт спит. Однако я бы предпочел отложить завершение сценария до тех пор, пока аудиопоток не решит, что он закончен.

Есть ли способ сохранить сеанс Python живым, пока не будут выполнены определенные критерии? Или какой-то цикл ожидания - единственный вариант?

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Вы можете запустить дочерний поток, содержащий обратный вызов, а основной поток может подождать / присоединиться к дочернему потоку до его завершения.

1 голос
/ 23 февраля 2011

Несколько способов.

Создание трубы.Передайте конец чтения на select.select() без тайм-аута.Остановите запись, когда звук закончится.

Получите семафор или мьютекс дважды.Отпустите его, когда звук закончится.

И еще, что вам, вероятно, не понадобится.

0 голосов
/ 01 февраля 2013

Если все, что вам нужно сделать, это дождаться завершения аудио, одно решение может быть получено из самого пакета PyAudio.

После создания вашего потока вы можете позвонить stream.is_active(), чтобы запросить аудиопоток, чтобы узнать, завершился ли он.

Пример этого включен в документацию: Пример: Аудио вход / выход в режиме обратного вызова .

...