Seite 1 von 1

pyaudio channels

Verfasst: Mittwoch 30. August 2017, 12:15
von ChristophS
Guten Tag zusammen

Mit der Zielsetzung einen Sinuston beliebiger Frequenz zu erzeugen habe ich ein Programm erstellt.

Code: Alles auswählen

def sineWave(samplingRate):
    sinFrequency = np.arange(samplingRate)*int(fField.get())
    nbrSinValues = sinFrequency/samplingRate
    sinRaw = np.sin((2*Pi)*nbrSinValues)
    sinWave = sinRaw.astype(np.float32)
    sinWave = sinWave * volume
    return sinWave

def callback(in_data, frame_count, time_info, status):
    data = sineWave(samplingRate)
    return ( data, pyaudio.paContinue)

def streamOn():                 
    stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=samplingRate,
                output=True,
                start=True,
                stream_callback=callback,
                frames_per_buffer = samplingRate)
Soweit funktioniert alles, nun möchte ich ein Stereosignal erzeugen, bzw. das Signal wahlweise dem linken Kanal oder rechten Kanal zuordnen.
Sobald ich channels auf 2 setzte, wird der callback ungültig, der stream spielt nur einmal den Frame-Puffer und bricht dann ab.

Gruss

Christoph

Re: pyaudio channels

Verfasst: Mittwoch 30. August 2017, 13:06
von __deets__
Du musst dann natuerlich die Groesse des Buffers verdoppeln, und die Daten "interleaven".

Re: pyaudio channels

Verfasst: Mittwoch 30. August 2017, 16:08
von ChristophS
Das mit dem Buffer war der Hinweis, danke

Was meinst Du mit "interleaven"?

Re: pyaudio channels

Verfasst: Mittwoch 30. August 2017, 16:26
von __deets__
Na der Aufbau eines Buffers ist normalerweise eine Liste von Frames, und in jedem Frame sind Anzahl-Kanaele-viele Samples. Also so

Buffersize=4
Channels=2

Dann hast du

ABABABAB

mit A linker Kanal und B rechter Kanal. Ein AB ist ein Frame, und davon halt 4. Bei deiner Sinusserei hoerst du so ohne weiteres keinen Unterschied, ausser das es halt doppelt so hoch ist ;)