При первом размещении здесь постараюсь быть кратким. Это классическая проблема «не удается получить доступ к файлу в апплете», но у меня возникли особые трудности.
Я пытаюсь переписать этот файл:
Тест JavaSound для libpd
в шаблонный апплет для загрузки libpd (https://github.com/libpd/libpd) патчей, сделанных в PureData (puredata.info) ... это уже работает в обычной функции Main в Java-программе без апплета (см. Выше), где основная функция находит патч используя:
PdBase.openAudio(0, outChans, (int) sampleRate);
int patch = PdBase.openPatch("samples/com/noisepages/nettoyeur/libpd/sample/test.pd");
PdBase.computeAudio(true);
Причина, по которой он пытается загрузить путь и файл в переменную int, заключается в том, что сама функция ядра делает это с помощью:
public synchronized static int openPatch(File file) throws IOException {
if (!file.exists()) {
throw new FileNotFoundException(file.getPath());
}
String name = file.getName();
File dir = file.getParentFile();
long ptr = openFile(name, (dir != null) ? dir.getAbsolutePath() : ".");
if (ptr == 0) {
throw new IOException("unable to open patch " + file.getPath());
}
int handle = getDollarZero(ptr);
patches.put(handle, ptr);
return handle;
}
public synchronized static int openPatch(String path) throws IOException {
return openPatch(new File(path));
}
Это связано с тем, что PD пытается идентифицировать каждый патч, давая дескриптор int (dollarZero, по старым причинам), так что дескриптор int передается для открытия и закрытия файла патча.
Так что теперь. Я пытаюсь загрузить тот же файл в апплет, поэтому, поскольку я считаю, что он запускается «в клиенте» и не знает, по какому пути я говорю, я прочитал на java.net.URL и попытался собрать вариации:
patchURL = new URL("test.pd");
PdBase.openPatch(patchURL.getPath().toString());
и
URL url = this.getClass().getResource("test.pd");
вдохновлено предыдущими вопросами в функциях init () и start () апплета, превращая исходную основную часть в звук локального статического метода ().
Все, что я получаю, это нулевые указатели. Я бы подумал, что все, что мне нужно, - это простой метод getDocumentBase (), но, похоже, я не могу заставить его работать. Кто-нибудь?