C 使用具有动态分配内存的waveOutWrite

C 使用具有动态分配内存的waveOutWrite,c,audio,dynamic-memory-allocation,static-memory-allocation,C,Audio,Dynamic Memory Allocation,Static Memory Allocation,我一直在用C语言试验声音 我发现了一段代码,可以让我生成PCM波声音并通过声卡输出 就目前的情况而言,它运行得相当好 下面是可以工作的代码:(您需要链接winmm才能工作) (警告:声音很大。) 注意:我听说有一种方法可以“锁定”部分内存,我可以用它来播放动态分配的音频缓冲区。如果是,我会怎么做 我还有一点烦恼。我发现,如果我在没有耳机的情况下启动程序,音频会通过电脑的扬声器播放,这是意料之中的,但当我插入耳机时,音频仍会通过电脑的扬声器播放。如何调整代码,以便在默认播放设备更改时将播放设备切换

我一直在用C语言试验声音

我发现了一段代码,可以让我生成PCM波声音并通过声卡输出

就目前的情况而言,它运行得相当好

下面是可以工作的代码:(您需要链接winmm才能工作)
(警告:声音很大。)

注意:我听说有一种方法可以“锁定”部分内存,我可以用它来播放动态分配的音频缓冲区。如果是,我会怎么做

我还有一点烦恼。我发现,如果我在没有耳机的情况下启动程序,音频会通过电脑的扬声器播放,这是意料之中的,但当我插入耳机时,音频仍会通过电脑的扬声器播放。如何调整代码,以便在默认播放设备更改时将播放设备切换为默认设备

非常感谢您抽出时间!你们太棒了

更新: 我发现Microsoft文档使用函数
GlobalAlloc()
HeapAlloc()
LocalAlloc()
VirtualAlloc()
为波形缓冲区分配内存。 以下代码取自:

这也取自:

问题就在这里:

WAVEHDR header = { buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 };
这里,
sizeof(buffer)
是指向缓冲区的指针的大小,因为缓冲区是一个
char*
。在第一个示例中,buffer是一个char数组,因此
sizeof(buffer)
返回了缓冲区的大小

您应该提供上面计算的分配大小。我会使用一些常量或变量来跟踪大小,这样你就不会重复计算了。例如:

//buffer to hold 1 minute of pcm wave data (8 bit, 8khz sample rate)
const size_t samples_per_second = 8000;
const size_t seconds = 60;
const size_t size = samples_per_second * seconds;
unsigned char *buffer = malloc(size);
size_t i;
for (i=0;i<size;i++){
    //generate pseudo-random sound.
    buffer[i] = (i*5&(i>>7)|i*3&(i*4>>10));
}
waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL);
WAVEHDR header = { buffer, size, 0, 0, 0, 0, 0, 0 };
//用于保存1分钟pcm波形数据的缓冲器(8位,8khz采样率)
const size\u t samples\u per\u second=8000;
常数大小\u t秒=60;
常数大小=每秒采样数*秒;
无符号字符*缓冲区=malloc(大小);
尺寸i;
对于(i=0;i>7)|i*3和(i*4>>10));
}
waveOutOpen(&hWaveOut,WAVE_映射器,&wfx,0,0,回调_NULL);
WAVEHDR头={buffer,size,0,0,0,0,0,0};
您可能希望对示例使用
无符号字符
。我相信WAV格式需要8位样本的无符号值。(对于其他尺寸,您需要签名样本。)

char *buffer = LocalAlloc(LMEM_FIXED,8000*60); //Doesn't work. Still no sound.
HANDLE hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, 8000*60);
char *buffer = GlobalLock(hData); //Also doesn't work, no sound.
WAVEHDR header = { buffer, sizeof(buffer), 0, 0, 0, 0, 0, 0 };
//buffer to hold 1 minute of pcm wave data (8 bit, 8khz sample rate)
const size_t samples_per_second = 8000;
const size_t seconds = 60;
const size_t size = samples_per_second * seconds;
unsigned char *buffer = malloc(size);
size_t i;
for (i=0;i<size;i++){
    //generate pseudo-random sound.
    buffer[i] = (i*5&(i>>7)|i*3&(i*4>>10));
}
waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL);
WAVEHDR header = { buffer, size, 0, 0, 0, 0, 0, 0 };