我有这段代码
#define BUFFER_LEN (2048)
static float buffer[BUFFER_LEN];
int readcount;
while ((readcount = sf_read_float(handle, buffer, BUFFER_LEN))) {
// alsa play
}
从缓冲区读取BUFFER_LEN浮点数,并返回它实际读取的浮点数。 “handle”告诉sf_rad_float缓冲区有多大。
E.g。如果缓冲区包含5个浮点数,BUFFER_LEN为3,则readcount将首先返回3,下一次为2,并且while循环将退出。
我希望有一个同样的功能。
更新
经过大量编码后,我认为这是解决方案。
#include <stdio.h>
int copy_buffer(double* src, int src_length, int* src_pos,
float* dest, int dest_length) {
int copy_length = 0;
if (src_length - *src_pos > dest_length) {
copy_length = dest_length;
printf("copy_length1 %i\n", copy_length);
} else {
copy_length = src_length - *src_pos;
printf("copy_length2 %i\n", copy_length);
}
for (int i = 0; i < copy_length; i++) {
dest[i] = (float) src[*src_pos + i];
}
// remember where to continue next time the copy_buffer() is called
*src_pos += copy_length;
return copy_length;
}
int main() {
double src[] = {1,2,3,4,5};
int src_length = 5;
float dest[] = {0,0};
int dest_length = 2;
int read;
int src_pos = 0;
read = copy_buffer(src, src_length, &src_pos, dest, dest_length);
printf("read %i\n", read);
printf("src_pos %i\n", src_pos);
for (int i = 0; i < src_length; i++) {
printf("src %f\n", src[i]);
}
for (int i = 0; i < dest_length; i++) {
printf("dest %f\n", dest[i]);
}
return 0;
}
下次调用copy_buffer()时,dest包含3,4。再次运行copy_buffer()
仅复制值“5”。所以我认为它现在有效。
虽然不是很漂亮,但我int src_pos = 0;
外面copy_buffer()
。
如果我可以给copy_buffer()
一个唯一的句柄而不是&src_pos
,那就好了,就像sndfile一样。
有谁知道如何做到这一点?
答案 0 :(得分:2)
答案 1 :(得分:0)
我开始看它,但你也可以这样做: libsndfile 是开源的,所以可以看看sf_read_float()
是如何工作的,并创建一个函数来自缓冲区的同样的事情。 http://www.mega-nerd.com/libsndfile/有一个下载链接。