Как вызвать функцию «process», используя метод «subscribe» ALAudioDevice - PullRequest
0 голосов
/ 07 июня 2019

Я новичок в программировании NAO, и у меня возникли некоторые проблемы с API ALAudioDevice.Моя проблема заключается в следующем: я написал модуль Python, который должен записывать необработанные данные с переднего микрофона.Документация по API ALAudioDevice гласит, что метод «подписаться (...)» автоматически и регулярно вызывает функцию «процесс» с необработанными данными с микрофонов в качестве входных данных.Я написал код для выполнения этого процесса (см. Ниже), и он работает без поднятия флага ошибки.Однако подписка обходит функцию «процесс», и модуль вообще не получает никакого звука.У кого-нибудь была такая же проблема?

import qi

class AudioModule(object):
    def __init__(self):
        super(AudioModule, self).__init__()
        self.moduleName = "AudioModule"

        try :
            self.ALAudioDevice = ALProxy("ALAudioDevice")
        except Exception, e:
            self.logger.error("Error when creating proxy on ALAudioDevice:")
            self.logger.error(e)

    def begin_stream(self):
        self.ALAudioDevice.setClientPreferences(self.moduleName, 16000, 3, 0)
        self.ALAudioDevice.subscribe(self.moduleName)

    def end_stream(self):
        self.ALAudioDevice.unsubscribe(self.moduleName)

    def processRemote( self, nbOfChannels, samplesByChannel, altimestamp, buffer ):
        nbOfChannels = nbOfChannels
        mylogger = qi.Logger("data")
        mylogger.info("It works !" + str(nbOfChannels))

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)
        self.audio = AudioModule()

    def onLoad(self):
        self.serviceId = self.session().registerService("AudioModule", self.audio)
        pass

    def onUnload(self):
        if self.serviceId != -1:
            self.session().unregisterService(self.serviceId)
            self.serviceId = -1
        pass

    def onInput_onStart(self):
        self.audio.begin_stream()
        self.onInput_onStop()
        pass

    def onInput_onStop(self):
        self.audio.end_stream()
        self.onUnload
        self.onStopped()
        pass

1 Ответ

1 голос
/ 08 июня 2019

Похоже, что вы подписываетесь на аудио из коробки Choregraphe. Я не уверен, что это должно работать.

Но в этой конфигурации код Python выполняется из того же процесса, что и служба ALAudioDevice. Поэтому, вероятно, вам следует назвать ваш обратный вызов «process» вместо «processRemote».

В противном случае вы можете сделать это из отдельного скрипта Python .

...