1

这是我的基本程序,它应该很容易用 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 调用这个程序来对附加产品进行音频质量测量,并且没有任何内容被读回,即使从命令行运行时它会打印出来(而不是重定向) )。

4

0 回答 0