Что мне следует использовать в Android при портировании кода C++, написанного с помощью libsndfile?

Я переношу небольшой (‹10 классов) проект C++ на Java. Проект манипулирует звуковыми файлами, и в C++ это делается с помощью 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.

Редактировать 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. Кто-нибудь может придумать способ обойти это?


person fredley    schedule 28.10.2010    source источник
comment
Я нашел код micdroid на github, который выглядит примерно на полпути к тому, что мне нужно, будет продолжать поиск похожих приложений с открытым исходным кодом...   -  person fredley    schedule 02.11.2010


Ответы (3)


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

person Erik de Castro Lopo    schedule 29.10.2010
comment
Попробуйте в списке рассылки libsndfile-devel. Там есть как минимум один человек, который это сделал. - person Erik de Castro Lopo; 01.11.2010

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

person Amir Afghani    schedule 28.10.2010
comment
Извините, я должен был добавить тег Android, я на самом деле переношу на Android, что (согласно моим исследованиям) делает вещи JNI очень ужасными. А также это часть моего проекта за последний год, это одна из вещей, которые я обещал сделать в своем проекте, и работа над будущими проектами может включать в себя результаты этого, так что чем меньше уровней сложности, тем лучше. - person fredley; 29.10.2010

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

person Ben Collins    schedule 08.11.2010
comment
Смотрите мой комментарий к сообщению Амира, это работа по программированию, которую я должен выполнить для своего проекта последнего года. - person fredley; 08.11.2010