void layer1and2 (NoteData input)
{
while(!feof(textFilePointer2))
{
float frequency[2];
float amplitude[2];
amplitude[0] = input.velocity/127.0;
amplitude[1] = input.velocity/127.0;
frequency[0] = 440 * pow(2, (input.notes-69) /12.0);
fscanf(textFilePointer, " %d %d\n", &input.notes, &input.velocity);
frequency[1] = 440 * pow(2, (input.notes-69) /12.0);
fscanf(textFilePointer2, " %d %d\n", &input.notes, &input.velocity);
printf(" %d %d\n\n", input.notes, input.velocity);
aserveOscillator(1, frequency[0], amplitude[0], 0);
aserveOscillator(0, frequency[1], amplitude[1], 2);
aserveSleep(500);
aserveOscillator(1, 0, 0, 0);
aserveOscillator(0, 0, 0, 0);
}
}
嗨,我是编程的新手,所以请放轻松。 我程序的这一部分是使用不同的振荡器同时回放两个序列的功能。我不确定我是否正确的方式呢? 目前,笔记信息是从'textFilePointer2'收集的,但我需要从'textFilePointer&中获取笔记数据。 textFilePointer2'同时! 任何帮助将非常感谢,提前感谢。
答案 0 :(得分:0)
你在细节上有点模糊,但我猜测问题是textFilePointer和textFilePointer2正在实时提供数据,并且有一个没有数据的文件描述符导致程序阻塞,尽管事实上,另一个人已经准备好了。
执行此操作的一种方法是打开文件,而不是使用stdio的open,它返回带有fscanf等所有好东西的FILE *,使用系统调用:
#include <stdio.h>
#include <unistd.h>
#include <sys/fcntl.h>
void layer1and2 (NoteData input)
{
int flags = fcntl(fileno(textFilePointer), F_GETFL, 0);
fcntl(fileno(textFilePointer), F_SETFL, flags | O_NONBLOCK);
flags = fcntl(fileno(textFilePointer2), F_GETFL, 0);
fcntl(fileno(textFilePointer2), F_SETFL, flags | O_NONBLOCK);
现在,对textFilePointers的读取不会阻止:
int retval;
retval = fscanf(textFilePointer, " %d %d\n", &input.notes, &input.velocity);
如果fscanf返回-1,则没有数据要从textFilePointer读取,您可以忽略input.notes和input.velocity。如果返回值为0,则扫描模式与输入数据不匹配(想象一下fscanf(“%d”),输入中的第一个东西是“abcde”。)当fscanf返回正值时,它是扫描物品的数量:
if (retval > 0) {
/* Set your oscillator here */
}
这可能是最简单的方法,但如果你查找select(),你也可能找到你需要的东西。我发现select()对于许多带有文件描述符的新手来说有点混乱,所以看看设置标志是否适合你。