2012-02-12 18 views
5

¿Hay algún tutorial o ejemplo sobre cómo reproducir archivos WAV en Mac desde la aplicación creada por Delphi XE2 FireMonkey?¿Hay alguna reproducción de sonido WAV en Mac desde Delphi XE2?

Lo digo porque el código no funciona:

var 
    //fWaves head and data is initialized and plays properly on Win through OpenAL 
    fWaves: array of record 
    Head: TWAVHeaderEx; 
    Data: array of byte; 
    end; 
    D: NSData; 
    N: NSSound; 
begin 
    D := TNSData.Wrap(TNSData.Create.initWithBytes(@fWaves[0].Head, SizeOf(fWaves[0].Head) + fWaves[0].Head.DataSize)); 
    ShowMessage(IntToStr(D.length)); //--Length is correct 
    N := TNSSound.Wrap(TNSSound.Create.initWithData(D)); 
    ShowMessage(FloatToStr(N.Duration)); //--Displays 0 
    if N.play then 
    ShowMessage('Yes') 
    else 
    ShowMessage('No'); //--Always returns NO 
end; 

Estoy cargando encabezado del archivo WAV y datos de la memoria y juega bien con OpenAL. Entonces, el problema está en algún lugar de mi uso de NSSound. ¿Podría alguien proporcionar ejemplos de funcionamiento de la reproducción de sonido Delphi XE2 en Mac?

+0

Supongo que el formato de un registro fwaves no coincide exactamente con el formato de un archivo WAV real. Intente usar los bytes sin procesar del archivo. –

+0

Probé eso, también probé initFromFile (path_to_aiff) .. Nada ayudó. Así que finalmente cambié a OpenAL. – Kromster

Respuesta

0

lo mismo que publicar como una respuesta, en caso de que ayuda a nadie:

intentado eso, así trató initFromFile(path_to_aiff) .. Nada ayudó. Así que finalmente cambié a OpenAL.

Quizás en el futuro Embarcadero solucione esa forma específica de acceder a NSSound, pero por ahora OpenAL funciona mejor. Además, OpenAL es multiplataforma, lo que significa que puedo usar el mismo código de sonido en Win y Mac.

3

Freepascal/Lazarus tiene una unidad llamada "macosall.pas" que es una traducción de los archivos de cabecera os-x C++ a pascal, lo que le permite llamar a funciones os-x nativas.

Lamentablemente, esta unidad no forma parte de delphi, pero al abrir la unidad puede copiar la declaración de función a delphi y debería funcionar.

Espero que encuentre lo que necesita en la API de quicktime, que es el eje central de los medios en las máquinas de manzanas. Consulte también Apple developer y eche un vistazo a los documentos.

+0

Lo que no me da una pista sobre lo que está mal con NSSound-NSData en el código entre comillas. – Kromster

+0

Mientras codificaba en C# y mono para iOS, experimenté muchos de los mismos problemas pero en diferentes áreas. Si TNSData tiene los mismos métodos que la clase Objective C original, puede enviar los datos como un NSStream, NSBuffer o incluso como texto. En el código anterior, parece que utilizas un búfer de bytes normal, intenta inicializar desde un flujo. Un ejemplo es el diálogo de envío de correo que, de acuerdo con Apple Docs, debe tomar casi cualquier objeto NSdata, pero no fue hasta que utilicé una transmisión que funcionó. –

Cuestiones relacionadas