我的系统有USB DAC能够播放24/96和24/192格式,但是当我尝试使用Java播放它时,我得到了行不可用的异常。因此,Java声音文档,Java不会对样本和比特率带来任何限制,并且下划线音响系统也会受到限制。所以我追溯了异常的来源,看起来像是原生函数
private static native void nGetFormats(int mixerIndex, int deviceID,
boolean isSource, Vector formats);
不会使用16/48以上的相应行信息填充格式。 我查看了来源here。
然而,要证明该函数确实不返回我需要的格式或者它只是返回略有不同,我必须看到实际的格式列表。但我无法弄清楚它是如何达到的。 DirectDL的方法是私有的:
private AudioFormat[] getHardwareFormats() {
return hardwareFormats;
}
所以我的问题有两部分:
我如何才能获得Java从硬件获得的支持格式列表?在这种情况下,我可以编写自己的DirectAudioDevice。
是否还有其他标准Java声音替代方案来管理来自Java的更高采样率?例如,Tritonus,但它看起来很旧而且不受支持。
我在Window上进行了测试,因此计划在Linux上使用与Oracle JRE不同的方法重复它。但是我还是需要找到便携式解决方案。
答案 0 :(得分:1)
我找到了一些解决方案,因此我可以使用FLAC,APE和Wavpack格式的Java收听24 / 96Khz和24 / 192Khz录音。 经过一些Java声音调试后,我发现由于某种原因,Java运行时将位深度限制为16位,但接受高采样率为96Khz和192KHz。所以我借用了MediaChest的采样解决方案。我还得到了JustFLAC,它为FLAC文件提供24/192支持。如果不更新我计划很快完成的Java运行时本机库,就不可能直接通过硬件支持24/192。
编辑:最新的更新是:我查看了本机Java运行时,发现了以下内容:
static INT32 bitsArray[] = { 8, 16};
....
#define BITS_COUNT sizeof(bitsArray)/sizeof(INT32)
....
for (rateIndex = 0; rateIndex < SAMPLERATE_COUNT; rateIndex++) {
for (channelIndex = 0; channelIndex < CHANNELS_COUNT; channelIndex++) {
for (bitIndex = 0; bitIndex < BITS_COUNT; bitIndex++) {
DAUDIO_AddAudioFormat(creator, bitsArray[bitIndex],
因此,您可以看到8位和16位被硬编码并用于支持的格式矩阵生成。通过添加两个常量来修复似乎很容易,但是它会导致创建自己的Java运行时副本,这是不可接受的。所以看起来我需要启动一些社区流程来接受我的建议,然后将其包含在下一个Java运行时更新中。
编辑:还有一次更新。 Linux声音本机实现似乎更好。它仅限制24位样本大小。因此,如果下划线声音系统(ALSA)允许采样深度,则Java可以播放24位/ 192,000格式。我使用最新的Raspbian和JDK 8 EA在Raspberry Pi上测试了它。不幸的是,即使是最新的Arch和Pidora也没有ALSA的改进。
答案 1 :(得分:0)
要在私有字段中读取和写入值,可以使用反射。 StackOverflow中的Java Tutorial和question。
关于你的第二个问题,我发现了一个名为jd3lib的图书馆似乎是最近的。