これが私の基本的なプログラムです。これは 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 からこのプログラムを呼び出して、接続された製品のオーディオ品質測定を行っており、何も読み戻されていなかったからです。 )。