Что я должен использовать в Android при переносе кода C ++, написанного с помощью libsndfile? - PullRequest
4 голосов
/ 29 октября 2010

Я портирую небольшой (<10 класс) проект C ++ на Java.Проект управляет звуковыми файлами, и в C ++ делает это, используя <a href="http://www.mega-nerd.com/libsndfile/" rel="nofollow"> libsndfile .Код включает в себя такие вещи, как:

const int channels = audioFileInfo.channels;
...
sf_readf_double( audioFile, inputBuffer, MAX_ECHO );
...
sf_writef_double( outputAudioFile, &currentAudioBuffer[WINDOW_SIZE * channels], SEGMENTATION_LENGTH );

В Java, как лучше всего управлять звуковыми файлами на низком уровне?Я говорю о таких вещах, как нормализация, добавление эха и т. Д.

Отчет о проделанной работе

После небольшой работы я нашел javax.sound.sampled, похоже, он может справиться с работой.

Редактировать 2 При ближайшем рассмотрении это не сработает (или, по крайней мере, не поможет), поскольку использует пакет com.sun.sound.

Edit 3 При еще большем осмотре и экспериментах пакеты com.sun.sound и sun.misc выпускаются под GNU GPLv2, и я загрузил их в свой проект.Переименовав javax.sound.sampled в imp.javax.sound.sampled, проект компилируется, и я могу создавать AudioFileFormat объекты без каких-либо исключений.У меня еще не было возможности поиграть, но я буду держать вас в курсе.

Редактировать 4 Хорошо, некоторые вещи работают с javax.sound.sampled, другие делаютне.Например, такие вызовы, как:

AudioInputStream stream = AudioSystem.getAudioInputStream(waveFile));

не работают, однако я могу обойти это, выполнив:

WaveFileReader wfr = new WaveFileReader();
AudioInputStream stream = wfr.getAudioInputStream(waveFile);

Как правило, вызовы таких вещей, как AudioSystem.getAudioFileTypes(), возвращаются пустымисписки.Я могу вникать в пакеты и видеть, что это как-то связано с провайдерами, но я не знаю, как это исправить.Получив мой stream объект, он правильно сообщает о его кодировке и т. Д., Что обнадеживает.

Моя большая проблема в данный момент - создание объекта Clip.Это должно быть создано с помощью объекта Line, который обычно приходит из AudioSystem.Кто-нибудь может придумать способ обойти это?

Ответы [ 3 ]

4 голосов
/ 29 октября 2010

libsndfile может быть скомпилирован для Android с помощью Native Development Kit. После того, как вы скомпилировали библиотеку для Android, вы сможете использовать JNI для доступа к ней из Java.

0 голосов
/ 08 ноября 2010

Если вы можете портировать libsndfile с помощью NDK, почему бы просто не использовать NDK для прямого переноса вашего кода C ++ и не беспокоиться о переносе его на java?

0 голосов
/ 29 октября 2010

Почему бы вам просто не сохранить этот код на C ++ и вызвать его на Java через JNI ?

...