pyaudio channels

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChristophS
User
Beiträge: 37
Registriert: Montag 7. August 2017, 12:52

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
Zuletzt geändert von Anonymous am Mittwoch 30. August 2017, 13:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst dann natuerlich die Groesse des Buffers verdoppeln, und die Daten "interleaven".
ChristophS
User
Beiträge: 37
Registriert: Montag 7. August 2017, 12:52

Das mit dem Buffer war der Hinweis, danke

Was meinst Du mit "interleaven"?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 ;)
Antworten