3

I'm trying to stream audio playing internally. Currently, my script has a more hardware based solution where the audio outputs through the auxiliary out which connects to a USB auxiliary line-in adapter. For simplicity, it would be much better to record audio internally rather than having to use hardware to loop the audio signal back into itself.

My relevant code:

    def encode(**kwarg):
        global audio
        print('Encoding: '+str(kwarg))
        #encoding algorithm goes here.
        writeSaveFlag = False
        #self.queueEncoding()
        print('process encode')

        # create pyaudio stream
        stream = False
        while not stream:
            try:
                stream = audio.open(format = kwarg['resolution'],rate = kwarg['sampleRate'],channels = kwarg['channels'],input_device_index = kwarg['deviceIndex'],input = True,frames_per_buffer=kwarg['chunk'])
            except:
                audio.terminate()
                audio = pyaudio.PyAudio()
                self.rewindSong()
        t = Timer(songDuration-encodingDelayTolarance,checkStatus,kwargs={'currentSong':kwarg['currentSong'],'tolerance':kwarg['tolerance']})
        t.start()
        startTime = time.time()
        playFlag = False
        print("recording")
        frames = []

        # loop through stream and append audio chunks to frame array
        for ii in range(0,int((kwarg['sampleRate']/kwarg['chunk'])*kwarg['encodeDuration'])):
            #if time.time() - startTime > 2000 and playFlag == False:
            #    self.play()
            data = stream.read(kwarg['chunk'])
            frames.append(data)

        print("finished recording")

        stream.stop_stream()
        stream.close()

        # save the audio frames as .wav file
        wavefile = wave.open(saveFilePath+kwarg['outputFileName']+'.wav','wb')
        wavefile.setnchannels(kwarg['channels'])
        wavefile.setsampwidth(audio.get_sample_size(kwarg['resolution']))
        wavefile.setframerate(kwarg['sampleRate'])
        wavefile.writeframes(b''.join(frames))
        wavefile.close()
        processEncode(trackID=kwarg['trackID'])
        #clear memory
        gc.collect()
        #create a new instance for next recording
        self.queueEncoding()

I found this related question but the only answer posted suggests looping the audio as I already have. Would it be better to use an alternative library for this internal recording functionality? Does alsa recognize the internal audio as an audio device? Does pyaudio recognize non-physical audio devices such as an internal audio stream?

www139
  • 4,960
  • 3
  • 31
  • 56

0 Answers0