2009-08-04 8 views
5

Estoy jugando con PortAudio y Python.¿Convierte la lista de flotantes en el búfer en Python?

data = getData() 
stream.write(data) 

Quiero que mi transmisión reproduzca datos de sonido, que se representan en valores de Float32. Por lo tanto, utilizar la siguiente función:

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

Desafortunadamente eso no funciona porque stream.write quiere un objeto de búfer que se pasa en:

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

Así que mi pregunta es: ¿Cómo puedo convertir mi lista de flota en un objeto buffer?

Respuesta

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

Considere quizás en su lugar:

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

Tal vez usted tiene que utilizar un paquete como salmuera para serializar los datos en primer lugar.

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

A continuación, cargue de nuevo en:

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


d2 == d 

devuelve True

2

En realidad, la forma más fácil es usar el struct module. Está diseñado para convertir objetos Python en objetos "nativos" similares a C.

Cuestiones relacionadas