Cosa devo usare in Android quando il porting C ++ di codice scritto con libsndfile?
-
27-09-2019 - |
Domanda
Sono porting un piccolo (<10 classi) C ++ progetto Java. I manipola progetto file audio e in C ++ fa questo utilizzando libsndfile . Il codice include cose come:
const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, ¤tAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );
In Java, qual è il modo migliore per manipolare file audio su un livello basso? Sto parlando di cose come la normalizzazione, l'aggiunta di echi, ecc
Progress Report
Dopo un po 'di scavo ho trovato javax.sound.sampled , che sembra che potrebbe fare il lavoro.
Modifica 2 A ben vedere, non sarà il lavoro (o almeno non in alcun modo utilizzabile), dato che si basa sul pacchetto com.sun.sound
.
Modifica 3 On ancora di più l'ispezione, e la sperimentazione, i pacchetti com.sun.sound
e sun.misc
sono rilasciati sotto licenza GNU GPLv2, e li ho scaricati nel mio progetto. Avendo javax.sound.sampled
rinominato imp.javax.sound.sampled
, le compilazioni di progetto, e posso creare oggetti AudioFileFormat
senza eccezioni gettati, ancora. Non ho avuto la possibilità di giocare ancora molto ma vi terremo aggiornati.
Modifica 4 Ok, alcune cose sembrano funzionare con javax.sound.sampled, altri non. Per esempio, le chiamate come ad esempio:
AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));
non funzionano, però posso ottenere intorno a questo facendo:
WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);
In generale, chiama a cose come ritorno AudioSystem.getAudioFileTypes()
liste vuote. Posso approfondire i pacchetti e vedere che sia qualcosa a che fare con i fornitori, ma sono in perdita su come porre rimedio a questa. Dopo aver ottenuto il mio oggetto stream
lo fa segnalare la sua codifica ecc correttamente, il che è incoraggiante.
Il mio grosso problema in questo momento è la creazione di un oggetto clip. Questo deve essere creato con un oggetto linea, che normalmente provengono da AudioSystem. Qualcuno può pensare a un modo per aggirare questo?
Soluzione
libsndfile può essere compilato per Android utilizzando il kit di sviluppo nativo. Una volta che hai la libreria compilata per Android, si dovrebbe essere in grado di utilizzare JNI per l'accesso da Java.