这是我的基本程序,它应该很容易用 VisualStudio(甚至 express)编译。
// ConsoleApplication1.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <mmsystem.h>
#include <stdint.h>
#pragma comment(lib, "winmm.lib")
HWAVEIN hWaveIn;
WAVEFORMATEX WaveFormat;
WAVEHDR WaveHeader;
typedef union
{
uint32_t u32;
struct
{
int16_t iLeft;
int16_t iRight;
};
} audiosample16_t;
#define AUDIORATE (44100*4)
#define SECONDS (13)
audiosample16_t MyBuffer[AUDIORATE*SECONDS];
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello World!\n";
UINT WaveId = 0;
WaveFormat.wFormatTag = WAVE_FORMAT_PCM; // simple, uncompressed format
WaveFormat.nChannels = 2; // 1=mono, 2=stereo
WaveFormat.nSamplesPerSec = 44100;
WaveFormat.wBitsPerSample = 16; // 16 for high quality, 8 for telephone-grade
WaveFormat.nBlockAlign = WaveFormat.nChannels*WaveFormat.wBitsPerSample/8;
WaveFormat.nAvgBytesPerSec = (WaveFormat.nSamplesPerSec)*(WaveFormat.nChannels)*(WaveFormat.wBitsPerSample)/8;
WaveFormat.cbSize=0;
WaveHeader.lpData = (LPSTR)MyBuffer;
WaveHeader.dwBufferLength = sizeof(MyBuffer);
WaveHeader.dwFlags = 0;
std::cout << "Hello World!\n";
//std::cout << std::flush;
HRESULT hr;
if(argc>1)
hr= waveInOpen(&hWaveIn,WaveId,&WaveFormat,0,0,CALLBACK_NULL);
std::cout << "Hello World!\n";
std::cout << "Hello World!\n";
//std::cout << std::flush;
return 0;
}
如果您从不带参数的命令行调用它,一切都会打印出来(几个“Hello World!”)。如果你把它重定向到一个文件(myprog.exe > blah.txt)
,再一次,一切正常,几行“Hello World!” 按预期结束在文件中。
但是,如果您有一个参数(这样waveInOpen
被调用),它不会将任何内容重定向到该文件。该文件为空。如果您不重定向输出,它将很好地打印到命令提示符。
除非您取消注释 std::flush 行,否则该文件不为空并且一切正常。
导致这种情况的幕后到底发生了什么?无论如何,不应该在退出时刷新标准输出并通过管道传输到文件吗?waveInOpen()
像这样搞砸 stdio 缓冲的调用是什么?
FWIW,这是因为我们从 TCL 和 Python 调用这个程序来对附加产品进行音频质量测量,并且没有任何内容被读回,即使从命令行运行时它会打印出来(而不是重定向) )。