Mar*_* L. 9 c java java-native-interface kernel-module resampling
我开发了一个内核模块(Android),它为我提供:
PCM
16-bit
48000 Hz
2 channel
Run Code Online (Sandbox Code Playgroud)
我想把它流式传输到Java的Apple机场快线(AEX).
AEX需要44.1 kHz PCM,因此我必须重新采样PCM流.
我有以下可能性,但哪个最好?
advantages:
high-performant due to native C
already uses libsamplerate to resample wav, mp3, ogg, flac, aac, pls
openssl as static library
usable via command-line from my java-program via Runtime.exec()
disadvantages:
I am relative new to C
overloaded: I don't need wav, mp3.. only PCM
many dependencies with GPL-libraries which I have to compile for Android
only supports PCM already with 44.1 kHz, no resampling for PCM implemented yet
-> have to implement resampling for PCM
Run Code Online (Sandbox Code Playgroud)
advantages:
I CAN java :)
middle-performant due to resamling in C , but streaming in java
just one dependency to LGPL-library
no Runtime.exec() needed
disadvantages:
needs [bouncycastle][3] for AES which is a bit larger than openssl
less performant than solution #1 (but maybe fast enough)
Run Code Online (Sandbox Code Playgroud)
advantages:
most performant
no resampling at higher level
disadvantages:
I am relative new to C
Is it possible to use libsamplerate or libresample in kernel-space?!
Run Code Online (Sandbox Code Playgroud)
我是一个内心的java人,但是这个任务(尤其是在cpu受限设备上,比如手持设备)正在为C而哭.我建议只使用libsamplerate.它有一个简单的API,即使你是C的新手,你也可以通过Google搜索找到很多例子.
当然基于java的解决方案可以并且可以工作,它只是因为你的新C到用户吃电池似乎不礼貌:)
编辑:我可能会自相矛盾了一点,但即使性能是一个严重的问题,我会避免做任何事情在内核空间,除非我知道内核和硬件确实很好.鉴于此,我将使用链接到libsamplerate的用户空间程序.经过一段谷歌搜索后,我发现了这个例子(注意输出是插孔界面,显然它必须与你不同)
#include <jack/jack.h>
#include <samplerate.h>
int channels;
float data_samplerate;
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
void getDasData(float **dst,int num_frames){
/* Provide sound data here, and only here. */
}
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
long getDasResampledData_callback(void *cb_data, float **data){
static float ret[1024];
static float ret3[1024];
static float *ret2[2]={&ret[0],&ret[512]};
getDasData(ret2,512);
for(int i=0;i<512;i++){
ret3[i*2]=ret2[0][i];
ret3[i*2+1]=ret2[1][i];
}
*data=&ret3[0];
return 512;
}
void getDasResampledData(float **dst,int num_frames){
double ratio=samplerate/getSourceRate();
float outsound[num_frames*2];
long read=src_callback_read(dassrc_state,ratio,num_frames,outsound);
//fprintf(stderr,"read: %d, num_frames: %d\n",read,num_frames);
for(int i=0;i<read;i++){
dst[0][i]=outsound[i*2];
dst[1][i]=outsound[i*2+1];
}
if(read<num_frames){
float *newdst[2]={dst[0]+read,dst[1]+read};
getDasResampledData(newdst,num_frames-read);
}
}
static int process (jack_nframes_t nframes, void *arg){
int ch;
sample_t *out[channels];
for(ch=0;ch<channels;ch++){
out[ch]=(sample_t*)jack_port_get_buffer(ports[ch],nframes);
}
if( (fabs(data_samplerate - jack_samplerate)) > 0.1)
getDasResampledData(out,numSamples);
else
getDasData(outputChannelData,numSamples);
return;
audioCallback(NULL,0,out,channels,nframes);
}
int main(){
dassrc_state=src_callback_new(getDasResampledData_callback,SRC_QUALITY,2,NULL,NULL);
jack_set_process_callback(client, process,NULL);
}
Run Code Online (Sandbox Code Playgroud)
来自http://old.nabble.com/Example-of-using-libresample-with-jack-td8795847.html
这个例子看起来很简单,我希望你能用它.
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |