-1

わかりました。このチュートリアルに従っています:http ://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId = 4422&lngWId = 3

そしてこれまでのところ、.rawオーディオファイルをロードするプログラムが必要になるまで、すべてが機能するようになりました。

関連するコードは次のとおりです。

LPSTR loadAudioBlock(const char* filename, DWORD* blockSize)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD size = 0;
DWORD readBytes = 0;
void* block = NULL;

//open the file

if((hFile = CreateFile((LPCWSTR)filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
    return NULL;

// get it's size, allocate memory, and then read it into memory

size = GetFileSize(hFile, NULL);
block = HeapAlloc(GetProcessHeap(), 0, size);
ReadFile(hFile, block, size, &readBytes, NULL);

CloseHandle(hFile);
*blockSize = size;
return (LPSTR)block;
}

そしてそれを呼び出す私の主な機能:

int _tmain(int argc, _TCHAR* argv[])
{
HWAVEOUT hWaveOut; //device handle
WAVEFORMATEX wfx; //struct for format info
MMRESULT result; // for waveOut return values
LPSTR block;
DWORD blockSize;

// first let's set up the wfx format struct

wfx.nSamplesPerSec = 44100; // rate of the sample
wfx.wBitsPerSample = 16; //sample size
wfx.nChannels = 2; // 2 channels = stereo
wfx.cbSize = 0; // no extra info
wfx.wFormatTag = WAVE_FORMAT_PCM; //PCM format
wfx.nBlockAlign = (wfx.wBitsPerSample >> 3) * wfx.nChannels;
wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;

// then let's open the device

if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR)
{
    fprintf(stderr, "unable to open Wave Mapper device.\n");
    Sleep(1000);
    ExitProcess(1);
}

// if no errors then close it
printf("The Wave Mapper device was opened successfully!\n");

//load and play file
if((block = loadAudioBlock("ding.raw", &blockSize)) == NULL)
{
    fprintf(stderr, "Unable to load file\n");
    Sleep(1000);
    ExitProcess(1);
}
writeAudioBlock(hWaveOut, block, blockSize);
Sleep(1000);
waveOutClose(hWaveOut);
return 0;
}

プログラムを実行するたびに、「ファイルをロードできません」という出力が表示されます。exeファイルと同じディレクトリに「ding.raw」ファイルがあります。また、「C:// path」および「C:/ path」としてフルパスを実行しようとしましたが、コンパイラーは、pdbファイルをロードできないことに関するエラーをさらに表示します。

何か案は?Visual Studio 2012ProfessionalIDEとコンパイラを使用しています。

4

2 に答える 2

3

標準を使用する代わりに、chareg_TCHARLPCTSTRどこでも使用する必要があります。これにより、渡すすべての文字列と文字列ポインターが正しくなります。

argv引数を見ると、代わりに を_tmain使用していることがわかります。これは、いくつかのマクロに応じて、Windows が通常の文字と Unicode 文字の両方をサポートしているためです。詳細については、たとえばここを参照してください。_TCHARchar

したがって、問題の可能性があるものを解決するには (実際のエラー コードが表示されないため、 に関する私のコメントを参照してくださいGetLastError)、関数を次のように変更する必要があります。

void *loadAudioBlock(LPCTSTR filename, DWORD* blockSize)
{
    // ...

    if((hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
    return NULL;

    // ...
}

そして、次のように呼び出します。

// ...

void *block;

if((block = loadAudioBlock(_T("C:\\path\\ding.raw"), &blockSize)) == NULL)
{
    fprintf(stderr, "unable to open Wave Mapper device, error code %ld.\n", GetLastError());
    Sleep(1000);
    ExitProcess(1);
}

// ...

ご覧のとおり、ファイルはバイナリであり、読み取り可能なテキストがないため、戻り値の型も変更しました。

于 2012-09-02T09:31:12.730 に答える
0
LPSTR loadAudioBlock(const char* filename, DWORD* blockSize)
{
     if((hFile = CreateFile(CA2T(filename), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
return NULL;
}

ATL 変換マクロを参照してください: http://msdn.microsoft.com/en-us/library/87zae4a3%28v=vs.80%29.aspx const char* LPCWSTR をキャストするだけでは機能しません。

于 2012-09-02T08:49:06.543 に答える