同时播放两种声音的功能(C)

时间:2015-03-23 18:09:57

标签: c arrays function

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'同时! 任何帮助将非常感谢,提前感谢。

1 个答案:

答案 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()对于许多带有文件描述符的新手来说有点混乱,所以看看设置标志是否适合你。