从Beep()中删除睡眠,产生声音的替代方法?

时间:2015-12-07 10:08:45

标签: c audio

考虑以下计划:

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int main(int argc, char** argv) {
    for (int i = 0; i < 10; i++) {
        Beep(220 * i, 250);
        printf("%d\n", 22o * i);
    }
    return 0;
}

这会产生250毫秒的声音并打印出该声音的频率。然而,由于它在哔哔声之间睡觉,打印之间会有延迟。

相反,做printf("\a");之类的事情却没有在哔哔声之间睡觉。我知道它并不完全等同于Beep(),因为你无法调制声音或改变持续时间,但我感兴趣的是声音之间的零睡眠。

我希望Beep()使用持续时间为250毫秒的声音,但我不希望程序在它们之间睡眠。我有一个粒子模拟器,当发生碰撞时会产生Beep()的声音,但是当声音正在播放时,模拟会在持续时间内停止。我想让它发出250ms的哔哔声,但不涉及睡眠。

我有什么选择?

编辑; here's a video showing the pause in my simulator.

1 个答案:

答案 0 :(得分:2)

而不是在主线程中播放声音, 实例化一个用于播放蜂鸣声的线程。

然后让线程在发出哔哔声时自行杀死它。

Here是一个创建线程的教程:

此代码已从教程中获取,然后根据您的需要进行修改:

#include <pthread.h>
#include <stdio.h>

/* This is our thread function.  It is like main(), but for a thread*/
void *threadFunc(void *arg)
{

    for (int i = 0; i < 10; i++) {
        Beep(220 * i, 250);
    }

    return NULL;
}

int main(void)
{
    pthread_t pth;  // this is our thread identifier
    int i = 0;


    pthread_create(&pth,NULL,threadFunc,"foo");
    printf("%d\n", 22o * i);

    while(i < 100)
    {
        usleep(1);
        printf("simulation continues...\n");
        ++i;
    }

    printf("main waiting for thread to terminate...\n");
    pthread_join(pth,NULL);

    return 0;
}