2009-08-04 9 views
5

Gram w gry z PortAudio i Python.Konwertuj listę zmiennych do bufora w Pythonie?

Chcę, aby mój strumień odtwarzał dane dźwiękowe, które są reprezentowane w wartościach Float32. Dlatego używam następującą funkcję:

def getData(): 
    data = [] 
    for i in range(0, 1024): 
     data.append(0.25 * math.sin(math.radians(i))) 
    return data 

Niestety to nie działa, ponieważ stream.write chce obiektem bufor być przekazywane w:

TypeError: argument 2 must be string or read-only buffer, not list 

Więc moje pytanie brzmi: Jak mogę przekonwertować moją listę przenosi się do obiektu buforowego?

Odpowiedz

8
import struct 

def getData(): 
    data = [] 
    for i in range(0, 1024): 
     data.append(0.25 * math.sin(math.radians(i))) 
    return struct.pack('f'*len(data), *data) 
0

Rozważmy może zamiast:

d = [0.25 * math.sin(math.radians(i)) for i in range(0, 1024)] 

Być może trzeba użyć pakietu jak marynaty do serializacji danych pierwszy.

import pickle 
f1 = open("test.dat", "wb") 
pickle.dump(d, f1) 
f1.close() 

Następnie włóż ją z powrotem:

f2 = open("test.dat", "rb") 
d2 = pickle.Unpickler(f2).load() 
f2.close() 


d2 == d 

Zwraca TRUE

2

Faktycznie, najprostszym sposobem jest użycie struct module. Jest przeznaczony do konwersji z obiektów Pythona na "natywne" obiekty typu C.