約 2,913,080 件
https://w.atwiki.jp/sampleisbest/pages/88.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 fdump アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト fdump.c #include stdio.h void fdump(float value) { unsigned v = *(unsigned *) value; char bit[32+3]; char *b = bit; char sign;// 符号部(1bit) int exponent;// 指数部(8bit) double fraction;// 仮数部(23bit) int i; for (i = 0; i 32; i++) { *b++ = (v (1 (31-i))) ? 1 0 ; if (i == 0 || i == 8) *b++ = . ; } *b = \0 ; sign = (v 0x80000000) ? - + ; exponent = ((v 23) 0xff) - 127; fraction = (v 0x7fffff) / (double)0x800000; printf("%s s %c e 2^%d f 1+%.7f\n", bit, sign, exponent, fraction); } int main() { fdump(1.5f); fdump(0.5f); fdump(-2.0f); fdump(0.0f); return 0; } 出力 0.01111111.10000000000000000000000 s + e 2^0 f 1+0.5000000 0.01111110.00000000000000000000000 s + e 2^-1 f 1+0.0000000 1.10000000.00000000000000000000000 s - e 2^1 f 1+0.0000000 0.00000000.00000000000000000000000 s + e 2^-127 f 1+0.0000000 fdump1.c #include stdio.h void fdump(float value) { unsigned char *v = (unsigned char *) value; char bit[35]; char *b = bit; char sign;// 符号部(1bit) int exponent;// 指数部(8bit) double fraction = 0.0;// 仮数部(23bit) double d = 0.5; int i; for (i = 0; i 32; i++) { *b++ = (v[3-i/8] (1 (7-i%8))) ? 1 0 ; if (i == 0 || i == 8) *b++ = . ; } *b = \0 ; sign = (v[3] 0x80) ? - + ; exponent = (((v[3] 0x7f) 1) | (v[2] 7)) - 127; for (i = 9; i 32; i++) { if (v[3-i/8] (1 (7-i%8))) fraction += d; d *= 0.5; } printf("b %s s %c e 2^%d f 1+%.7f\n", bit, sign, exponent, fraction); } int main() { fdump(1.5f); fdump(0.5f); fdump(-2.0f); fdump(0.0f); return 0; } 出力 b 0.01111111.10000000000000000000000 s + e 2^0 f 1+0.5000000 b 0.01111110.00000000000000000000000 s + e 2^-1 f 1+0.0000000 b 1.10000000.00000000000000000000000 s - e 2^1 f 1+0.0000000 b 0.00000000.00000000000000000000000 s + e 2^-127 f 1+0.0000000
https://w.atwiki.jp/sampleisbest/pages/281.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 morse アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト 使用例 C \ morse -a0.2 -l5000 "トラ" morse.cpp // マルチバイト文字セット #pragma comment(lib, "winmm") #define _USE_MATH_DEFINES #include stdio.h #include math.h #include Windows.h #include vector using namespace std; #define SAFE_FREE(p)if (p) { free(p); p = NULL; } #define SAMPLING_RATE11025 #define FREQ882.0 // 関数プロトタイプ宣言 void AddDots(bool b, int count); // 欧文文字 LPCTSTR letters[] = { "01",// A "1000",// B "1010",// C "100",// D "0",// E "0010",// F "110",// G "0000",// H "00",// I "0111",// J "101",// K "0100",// L "11",// M "10",// N "111",// O "0110",// P "1101",// Q "010",// R "000",// S "1",// T "001",// U "0001",// V "011",// W "1001",// X "1011",// Y "1100",// Z }; // 数字 LPCTSTR numbers[] = { "11111",// 0 "01111",// 1 "00111",// 2 "00011",// 3 "00001",// 4 "00000",// 5 "10000",// 6 "11000",// 7 "11100",// 8 "11110",// 9 }; // 記号 LPCTSTR punctuation[] = { "010101",// . Period "110011",// , Comma "001100",// ? Question mark "011110",// Apostrophe "101011",// ! Exclamation mark "10010",// / Slash, Fraction bar "10110",// ( Parenthesis open "101101",// ) Parenthesis close "01000",// Ampersand, Wait "111000",// Colon "101010",// ; Semicolon "10001",// = Double dash "01010",// + Plus "100001",// - Hyphen, Minus "001101",// _ Underscore "010010",// " Quotation mark "0001001",// $ Dollar sign "011010",// @ At sign }; // 和文文字 LPCTSTR kana[] = { NULL,// 。 NULL,// 「 "010100",// 」(段落) "010101",// 、(区切点) NULL,// ・ "0111",// ヲ NULL,// ァ NULL,// ィ NULL,// ゥ NULL,// ェ NULL,// ォ NULL,// ャ NULL,// ュ NULL,// ョ NULL,// ッ "01101",// ー(長音) "11011",// ア "01",// イ "001",// ウ "10111",// エ "01000",// オ "0100",// カ "10100",// キ "0001",// ク "1011",// ケ "1111",// コ "10101",// サ "11010",// シ "11101",// ス "01110",// セ "1110",// ソ "10",// タ "0010",// チ "0110",// ツ "01011",// テ "00100",// ト "010",// ナ "1010",// ニ "0000",// ヌ "1101",// ネ "0011",// ノ "1000",// ハ "11001",// ヒ "1100",// フ "0",// ヘ "100",// ホ "1001",// マ "00101",// ミ "1",// ム "10001",// メ "10010",// モ "011",// ヤ "10011",// ユ "11",// ヨ "000",// ラ "110",// リ "10110",// ル "111",// レ "0101",// ロ "101",// ワ //"01001",// ヰ //"01100",// ヱ "01010",// ン "00",// ゛(濁点) "00110",// ゜(半濁点) }; // 外部変数 DWORD sampleLength = 0; PBYTE waveformData = NULL; vector bool dots; //============================================================================== int main(int argc, char *argv[]) { // プログラム引数 LPCTSTR words = NULL; double amp = 0.1; int loops = 0; int wpm = 20; for (int i = 1; i argc; i++) { LPCTSTR p = argv[i]; if (p[0] == - ) { switch (p[1]) { case a amp = atof(p + 2); break; case l loops = atoi(p + 2); break; case w wpm = atoi(p + 2); break; } } else { words = p; } } if (words == NULL) { fprintf(stderr, "usage morse -a(f) -l(n) -w(n) \"words\"\n"); return 1; } // 符号化 for (int i = 0; words[i]; i++) { LPCTSTR code = NULL; BYTE c = words[i]; if (c == ) { AddDots(false, 4); } else if ( A = c c = Z ) { code = letters[c - A ]; } else if ( a = c c = z ) { code = letters[c - a ]; } else if (0xa1 = c c = 0xdf) { code = kana[c - 0xa1]; } if (code) { for ( ; *code; code++) { AddDots(true, (*code 1) ? 3 1); AddDots(false, 1); } AddDots(false, 2); } } // 波形データの作成 int dotLen = SAMPLING_RATE * 60 / (50 * wpm); sampleLength = dots.size() * dotLen; waveformData = (PBYTE)malloc(sampleLength); int i = 0; for (vector bool iterator it = dots.begin(); it != dots.end(); it++) { if (*it) { for (int n = 0; n dotLen; n++) { double t = fmod(FREQ * i / SAMPLING_RATE, 1); double y = amp * sin(2 * M_PI * t); waveformData[i++] = BYTE(128 + 127 * y); } } else { for (int n = 0; n dotLen; n++) { waveformData[i++] = 128; } } } // Play WAVEFORMATEX wfx; wfx.wFormatTag= WAVE_FORMAT_PCM; wfx.wBitsPerSample= 8; wfx.nChannels= 1; wfx.nSamplesPerSec= SAMPLING_RATE; wfx.nBlockAlign= (wfx.wBitsPerSample / 8) * wfx.nChannels; wfx.nAvgBytesPerSec= wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize= 0; HWAVEOUT hwo; MMRESULT mmr = waveOutOpen( hwo, WAVE_MAPPER, wfx, NULL, 0, CALLBACK_NULL); WAVEHDR wh; ZeroMemory( wh, sizeof wh); wh.lpData= (LPSTR)waveformData; wh.dwBufferLength= sampleLength; wh.dwFlags= WHDR_BEGINLOOP | WHDR_ENDLOOP; wh.dwLoops= loops ? MAXDWORD 1; mmr = waveOutPrepareHeader(hwo, wh, sizeof wh); mmr = waveOutWrite(hwo, wh, sizeof wh); // Wait Sleep(loops ? loops 1000 * sampleLength / SAMPLING_RATE); // Stop mmr = waveOutReset(hwo); mmr = waveOutUnprepareHeader(hwo, wh, sizeof wh); mmr = waveOutClose(hwo); SAFE_FREE(waveformData); return 0; } void AddDots(bool b, int count) { for (int n = 0; n count; n++) { dots.push_back(b); } }
https://w.atwiki.jp/sampleisbest/pages/283.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 TestMP3 アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 参考 MP3 TestMP3.cpp // TestMP3 MP3ファイルの再生 #pragma comment(lib, "winmm") #pragma comment(lib, "msacm32") #include Windows.h #include MMReg.h #include MSAcm.h #include "resource.h" struct ID3V2HEADER { BYTE id[3]; BYTE version[2]; BYTE flag; BYTE size[4]; }; typedef ID3V2HEADER *LPID3V2HEADER; // 関数プロトタイプ宣言 INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnDropFiles(HWND hDlg, WPARAM wParam); void OnPlay(HWND hDlg); void OnStop(HWND hDlg); void Stop(void); BOOL IsId3v2(LPBYTE lpData, DWORD dwDataSize, LPDWORD lpdwTagSize); BOOL GetMp3Format(LPBYTE lpData, LPMPEGLAYER3WAVEFORMAT lpmf); BOOL DecodeToWave(LPWAVEFORMATEX lpwfSrc, LPBYTE lpSrcData, DWORD dwSrcSize, LPWAVEFORMATEX lpwfDest, LPBYTE *lplpDestData, LPDWORD lpdwDestSize); BOOL LoadMP3(LPTSTR lpszFile, LPMPEGLAYER3WAVEFORMAT lpmf, LPBYTE *lplpData, LPDWORD lpdwSize); // 外部変数 TCHAR szFile[MAX_PATH]; LPBYTE lpWaveData; HWAVEOUT hwo; WAVEHDR wh; //============================================================================== int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc); return 0; } INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR result = TRUE; switch (uMsg) { case MM_WOM_DONE //waveOutWrite((HWAVEOUT)wParam, (LPWAVEHDR)lParam, sizeof(WAVEHDR)); OnStop(hDlg); break; case WM_COMMAND switch (LOWORD(wParam)) { case IDOK OnPlay(hDlg); break; case IDCANCEL OnStop(hDlg); break; } break; case WM_DROPFILES OnDropFiles(hDlg, wParam); DragFinish((HDROP)wParam); break; case WM_CLOSE EndDialog(hDlg, 0); break; case WM_DESTROY Stop(); break; default result = FALSE; } return result; } void OnDropFiles(HWND hDlg, WPARAM wParam) { HDROP hDrop = (HDROP)wParam; DragQueryFile(hDrop, 0, szFile, _countof(szFile)); SetDlgItemText(hDlg, IDC_EDIT, szFile); } void OnPlay(HWND hDlg) { DWORD dwMP3Size; LPBYTE lpMP3Data = NULL; MPEGLAYER3WAVEFORMAT mf; if (!LoadMP3(szFile, mf, lpMP3Data, dwMP3Size)) { return; } WAVEFORMATEX wf; DWORD dwWaveSize; if (!DecodeToWave((LPWAVEFORMATEX) mf, lpMP3Data, dwMP3Size, wf, lpWaveData, dwWaveSize)) { delete[] lpMP3Data; return; } delete[] lpMP3Data; if (waveOutOpen( hwo, WAVE_MAPPER, wf, (DWORD_PTR)hDlg, 0, CALLBACK_WINDOW) != MMSYSERR_NOERROR) { return; } wh.lpData= (LPSTR)lpWaveData; wh.dwBufferLength= dwWaveSize; wh.dwFlags= 0; waveOutPrepareHeader(hwo, wh, sizeof(WAVEHDR)); waveOutWrite(hwo, wh, sizeof(WAVEHDR)); EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); } void OnStop(HWND hDlg) { Stop(); EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); } void Stop(void) { if (hwo) { waveOutReset(hwo); waveOutUnprepareHeader(hwo, wh, sizeof(WAVEHDR)); waveOutClose(hwo); hwo = NULL; } if (lpWaveData) { delete[] lpWaveData; lpWaveData = NULL; } } BOOL GetMp3Format(LPBYTE lpData, LPMPEGLAYER3WAVEFORMAT lpmf) { static const DWORD dwBitTableLayer3[][16] = { {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0} }; static const DWORD dwSampleTable[][3] = { {44100, 48000, 32000}, {22050, 24000, 16000} }; // 同期ヘッダ if (lpData[0] != 0xff || lpData[1] 5 != 0x07) { return FALSE; } // バージョン BYTE version; switch (lpData[1] 3 0x03) { case 3 // 11=MPEG1 version = 1; break; case 2 // 10=MPEG2 version = 2; break; default return FALSE; } // レイヤー if ((lpData[1] 1 0x03) != 1) {// 01=Leyer3 return FALSE; } // ビットレート BYTE index = lpData[2] 4; DWORD dwBitRate = dwBitTableLayer3[version - 1][index]; // サンプリングレート index = lpData[2] 2 0x03; DWORD dwSampleRate = dwSampleTable[version - 1][index]; // パディング BYTE padding = lpData[2] 1 0x01; // チャンネルモード BYTE channel = (lpData[3] 6) == 3 ? 1 2;// 11=シングルチャネル WORD wBlockSize = (WORD)((1152 * dwBitRate * 1000 / dwSampleRate) / 8) + padding; lpmf- wfx.wFormatTag= WAVE_FORMAT_MPEGLAYER3; lpmf- wfx.nChannels= channel; lpmf- wfx.nSamplesPerSec= dwSampleRate; lpmf- wfx.nAvgBytesPerSec= (dwBitRate * 1000) / 8; lpmf- wfx.nBlockAlign= 1; lpmf- wfx.wBitsPerSample= 0; lpmf- wfx.cbSize= MPEGLAYER3_WFX_EXTRA_BYTES; lpmf- wID= MPEGLAYER3_ID_MPEG; lpmf- fdwFlags= padding ? MPEGLAYER3_FLAG_PADDING_ON MPEGLAYER3_FLAG_PADDING_OFF; lpmf- nBlockSize= wBlockSize; lpmf- nFramesPerBlock= 1; lpmf- nCodecDelay= 0x571; return TRUE; } BOOL DecodeToWave(LPWAVEFORMATEX lpwfSrc, LPBYTE lpSrcData, DWORD dwSrcSize, LPWAVEFORMATEX lpwfDest, LPBYTE *lplpDestData, LPDWORD lpdwDestSize) { lpwfDest- wFormatTag = WAVE_FORMAT_PCM; acmFormatSuggest(NULL, lpwfSrc, lpwfDest, sizeof(WAVEFORMATEX), ACM_FORMATSUGGESTF_WFORMATTAG); HACMSTREAM has; if (acmStreamOpen( has, NULL, lpwfSrc, lpwfDest, NULL, 0, 0, ACM_STREAMOPENF_NONREALTIME) != 0) { MessageBox(NULL, TEXT("変換ストリームのオープンに失敗しました。"), NULL, MB_ICONWARNING); return FALSE; } DWORD dwDestSize; acmStreamSize(has, dwSrcSize, dwDestSize, ACM_STREAMSIZEF_SOURCE); LPBYTE lpDestData = new BYTE[dwDestSize]; ACMSTREAMHEADER ash; ZeroMemory( ash, sizeof(ACMSTREAMHEADER)); ash.cbStruct= sizeof(ACMSTREAMHEADER); ash.pbSrc= lpSrcData; ash.cbSrcLength= dwSrcSize; ash.pbDst= lpDestData; ash.cbDstLength= dwDestSize; acmStreamPrepareHeader(has, ash, 0); BOOL bResult = (acmStreamConvert(has, ash, 0) == 0); acmStreamUnprepareHeader(has, ash, 0); if (bResult) { *lplpDestData = lpDestData; *lpdwDestSize = ash.cbDstLengthUsed; } else { MessageBox(NULL, TEXT("変換に失敗しました。"), NULL, MB_ICONWARNING); *lplpDestData = NULL; *lpdwDestSize = 0; delete[] lpDestData; } return bResult; } BOOL IsId3v2(LPBYTE lpData, DWORD dwDataSize, LPDWORD lpdwTagSize) { BOOL bResult; LPID3V2HEADER lpHeader = (LPID3V2HEADER)lpData; if (memcmp(lpHeader- id, "ID3", 3) == 0) { *lpdwTagSize = ((lpHeader- size[0] 21)|(lpHeader- size[1] 14)|(lpHeader- size[2] 7)|(lpHeader- size[3])) + 10; bResult = TRUE; } else { LPBYTE lp = (lpData + dwDataSize) - 128; *lpdwTagSize = (memcmp(lp, "TAG", 3) == 0) ? 128 0; bResult = FALSE; } return bResult; } BOOL LoadMP3(LPTSTR lpszFileName, LPMPEGLAYER3WAVEFORMAT lpmf, LPBYTE *lplpData, LPDWORD lpdwSize) { HMMIO hmmio = mmioOpen(lpszFileName, NULL, MMIO_READ); if (hmmio == NULL) { MessageBox(NULL, TEXT("ファイルのオープンに失敗しました。"), NULL, MB_ICONWARNING); return FALSE; } DWORD dwSize = mmioSeek(hmmio, 0, SEEK_END); LPBYTE lpData = new BYTE[dwSize]; mmioSeek(hmmio, 0, SEEK_SET); mmioRead(hmmio, (HPSTR)lpData, dwSize); mmioClose(hmmio, 0); DWORD dwTagSize; LPBYTE lpMp3Data; if (IsId3v2(lpData, dwSize, dwTagSize)) { dwSize -= dwTagSize; lpMp3Data = new BYTE[dwSize]; CopyMemory(lpMp3Data, lpData + dwTagSize, dwSize); delete[] lpData; } else { dwSize -= dwTagSize; lpMp3Data = lpData; } if (!GetMp3Format(lpMp3Data, lpmf)) { delete[] lpMp3Data; return FALSE; } *lplpData = lpMp3Data; *lpdwSize = dwSize; return TRUE; } resource.h #define IDD_DIALOG100 #define IDC_EDIT1000 //#define IDC_PLAY1001 //#define IDC_STOP1002 TestMP3.rc // resource script #include Windows.h #include "resource.h" IDD_DIALOG DIALOGEX 100, 100, 320, 200 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW | WS_EX_ACCEPTFILES CAPTION "TestMP3" FONT 9, "MS Pゴシック" BEGIN EDITTEXTIDC_EDIT,10,10,300,150 DEFPUSHBUTTON"Play( P)",IDOK,200,170,50,15 PUSHBUTTON"Stop( S)",IDCANCEL,260,170,50,15 END
https://w.atwiki.jp/xboxonescore/pages/750.html
Big Crown:Showdown 項目数:19 総ポイント:1000 難易度:☆☆☆☆☆ Winner Winner Chicken Dinner Win your first game 50 Ka-Ching Collect your first coin 20 Greedy Guts Collect all of the coins from a treasure chest 50 Stylish Purchase your first hat 20 Fashionista Purchase all of the hats 200 The Powers of the Internet Complete an Online Multiplayer match 20 Sofa Knights Complete a Local Multiplayer match 20 Internet Friends Play with 4 people online 40 Friends with Benefits Play with 4 people locally 40 Game Designer Make a custom game 20 Games Design Intern Join a custom game 20 I.G. Knight Get your first knock-out 20 Turtle Knight Get your first shield deflection knock-out 50 Pacifist Complete a round without punching 50 Repo-man Knock 1000 objects off the track 100 So Near Yet So Far Be the last one alive but don t cross the finishing line 40 MARATHRONE! Run a Marathon(26.2 miles) 200 Square Eyes Knock the Knight s TV into the portal 20 Welcome to the Showdown Complete your first game 20
https://w.atwiki.jp/sampleisbest/pages/127.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 wtlhello アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 以下のATL/WTLを使用。 Windows Driver Kit Version 7.1.0 WTL 8.1.12085 リンカーのwarningの意味は「異なる属性の複数のセクションがマージされている」という事らしい。 リンカーオプションの/verboseや/mapを指定して調べてみたがよく分からない。 とりあえずwarningを抑止する事にした。 参考 Windows Template Library - Wikipedia Visual C++ 2010 Express の導入 【Part.6】 wtlhello.cpp /* ATL/WTLディレクトリの追加 構成プロパティ/VC++ ディレクトリ ・インクルード ディレクトリ:C \etc\wtl81_12085\Include;C \WinDDK\7600.16385.1\inc\atl71 ・ライブラリ ディレクトリ:C \WinDDK\7600.16385.1\lib\ATL\i386 構成プロパティ/リンカー/コマンド ライン ・追加オプション:/ignore 4078,4254 */ #pragma comment(lib, "atlthunk.lib") #include Windows.h // ATLヘッダ #define _ATL_NO_AUTOMATIC_NAMESPACE #include atlbase.h #include atlwin.h // WTLヘッダ #define _WTL_NO_AUTOMATIC_NAMESPACE #include atlapp.h #include atlcrack.h class HelloWindow public ATL CWindowImpl HelloWindow { public // ウィンドウクラス名を登録 DECLARE_WND_CLASS(TEXT("HelloWindow")); private // メッセージマップ BEGIN_MSG_MAP(HelloWindow) MSG_WM_PAINT(OnPaint) MSG_WM_DESTROY(OnDestroy) END_MSG_MAP() // 描画メッセージ void OnPaint(HDC) { WTL CPaintDC dc(m_hWnd); dc.TextOut(10, 10, TEXT("Hello, world"), -1); } // ウィンドウが破棄されるメッセージ void OnDestroy() { PostQuitMessage(0); } }; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int nCmdShow) { // ウィンドウのインスタンスを生成 HelloWindow wnd; HWND hWnd = wnd.Create(NULL, ATL CWindow rcDefault, TEXT("Hello, world"), WS_OVERLAPPEDWINDOW); if (!hWnd) { return -1; } // ウィンドウ表示 wnd.ShowWindow(nCmdShow); wnd.UpdateWindow(); // メッセージループ WTL CMessageLoop msgLoop; return msgLoop.Run(); }
https://w.atwiki.jp/sampleisbest/pages/85.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 wave アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト wave.c #pragma comment(lib, "winmm.lib") #define _USE_MATH_DEFINES #include math.h #include stdio.h #include Windows.h #define VOLUME64 #define FREQ440 #define SAMPLE_RATE11025 #define TONE_MSEC1000 #define DATA_LEN(SAMPLE_RATE * TONE_MSEC / 1000) int main() { WAVEFORMATEXwfx; MMRESULTmmr; HWAVEOUThwo; WAVEHDRwh; characData[DATA_LEN]; doubledWave; inti; // 波形データの作成 for (i = 0; i DATA_LEN; i++) { dWave = sin(i * FREQ * 2 * M_PI / SAMPLE_RATE); acData[i] = (char)(dWave * VOLUME) + 128; //acData[i] = rand() * 2 * VOLUME / RAND_MAX + 128 - VOLUME;// ホワイトノイズ } // Play wfx.wFormatTag= WAVE_FORMAT_PCM; wfx.nChannels= 1; wfx.nSamplesPerSec= SAMPLE_RATE; wfx.nAvgBytesPerSec= SAMPLE_RATE; wfx.nBlockAlign= 1; wfx.wBitsPerSample= 8; wfx.cbSize= 0; mmr = waveOutOpen( hwo, WAVE_MAPPER, wfx, 0, 0, CALLBACK_NULL); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutOpen\n"); return 1; } ZeroMemory( wh, sizeof wh); wh.lpData= acData; wh.dwBufferLength= DATA_LEN; mmr = waveOutPrepareHeader(hwo, wh, sizeof wh); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutPrepareHeader\n"); return 1; } mmr = waveOutWrite(hwo, wh, sizeof wh); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutWrite\n"); return 1; } // Wait Sleep(TONE_MSEC); // Stop mmr = waveOutReset(hwo); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutReset\n"); return 1; } mmr = waveOutUnprepareHeader(hwo, wh, sizeof wh); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutUnprepareHeader\n"); return 1; } mmr = waveOutClose(hwo); if (mmr != MMSYSERR_NOERROR) { fprintf(stderr, "error waveOutClose\n"); return 1; } return 0; }
https://w.atwiki.jp/sampleisbest/pages/54.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 DlgBase2 アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode DlgBase2.cpp #include stdio.h #include tchar.h #include Windows.h #include "resource.h" // 関数プロトタイプ宣言 int GetIniFileName(void); INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnInitDialog(HWND hDlg); void OnDestroy(HWND hDlg); void WriteIniFileInt(TCHAR* ptcSec, TCHAR* ptcKey, int iValue); // グローバル変数 TCHAR g_atcIniFile[_MAX_PATH] = _T(""); //============================================================================== int APIENTRY _tWinMain( HINSTANCEhInstance, HINSTANCEhPrevInstance, LPTSTRlpCmdLine, intnCmdShow) { if (GetIniFileName()) { return 0; } DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, DialogProc); return 0; } //------------------------------------------------------------------------------ int GetIniFileName(void) { TCHARatcPath[_MAX_PATH]; TCHARatcDrive[_MAX_DRIVE]; TCHARatcDir[_MAX_DIR]; TCHARatcFName[_MAX_FNAME]; TCHARatcExt[_MAX_EXT]; if (GetModuleFileName(NULL, atcPath, _countof(atcPath)) == 0) { return -1; } if (_tsplitpath_s(atcPath, atcDrive, atcDir, atcFName, atcExt) != 0) { return -1; } if (_tmakepath_s(g_atcIniFile, atcDrive, atcDir, atcFName, _T("ini")) != 0) { return -1; } return 0; } //------------------------------------------------------------------------------ INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTRiRetVal = TRUE;// メッセージを処理した TCHARatcStr[256]; intiRet; switch (uMsg) { case WM_COMMAND switch (LOWORD(wParam)) { case IDC_BUTTON_WORLD MessageBox(hDlg, _T("hello, world"), _T("World"), MB_OK); break; case IDOK GetDlgItemText(hDlg, IDC_EDIT_HELLO, atcStr, _countof(atcStr)); MessageBox(hDlg, atcStr, _T("OK"), MB_OK); break; case IDCANCEL iRet = MessageBox(hDlg, _T("終了しますか?"), _T("Cancel"), MB_YESNO); if (iRet == IDYES) { EndDialog(hDlg, IDCANCEL); } break; } break; case WM_INITDIALOG OnInitDialog(hDlg); iRetVal = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE EndDialog(hDlg, 0); break; case WM_DESTROY OnDestroy(hDlg); break; default iRetVal = FALSE;// メッセージを処理しなかった } return iRetVal; } //------------------------------------------------------------------------------ void OnInitDialog(HWND hDlg) { intiX; intiY; iX = GetPrivateProfileInt(_T("General"), _T("iX"), 0, g_atcIniFile); iY = GetPrivateProfileInt(_T("General"), _T("iY"), 0, g_atcIniFile); SetWindowPos(hDlg, HWND_TOP, iX, iY, 0, 0, SWP_NOSIZE); } //------------------------------------------------------------------------------ void OnDestroy(HWND hDlg) { RECTrc; GetWindowRect(hDlg, rc); WriteIniFileInt(_T("General"), _T("iX"), rc.left); WriteIniFileInt(_T("General"), _T("iY"), rc.top); } //------------------------------------------------------------------------------ void WriteIniFileInt(TCHAR* ptcSec, TCHAR* ptcKey, int iValue) { TCHARatcBuf[16]; _stprintf_s(atcBuf, _T("%d"), iValue); WritePrivateProfileString(ptcSec, ptcKey, atcBuf, g_atcIniFile); } resource.h #define IDD_MAIN_DIALOG100 #define IDC_STATIC-1 #define IDC_EDIT_HELLO1000 #define IDC_BUTTON_WORLD1001 DlgBase2.rc // リソーススクリプト #include windows.h #include "resource.h" IDD_MAIN_DIALOG DIALOGEX 0, 0, 320, 100 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW CAPTION "DlgBase2" FONT 9, "MS Pゴシック" BEGIN LTEXT"Hello( H) ",IDC_STATIC,8,8,48,12 EDITTEXTIDC_EDIT_HELLO,56,8,48,12,ES_AUTOHSCROLL PUSHBUTTON"World( W)",IDC_BUTTON_WORLD,104,8,48,12 DEFPUSHBUTTON"OK",IDOK,212,76,48,16 PUSHBUTTON"Cancel",IDCANCEL,264,76,48,16 END
https://w.atwiki.jp/sampleisbest/pages/31.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 sock アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト WSAはWindows Sockets APIを表す sock.c // インポート ライブラリ #pragma comment(lib, "ws2_32.lib") #include stdio.h #include WinSock2.h int main() { WSADATAwsaData; intiRet; iRet = WSAStartup(MAKEWORD(2, 2), wsaData); if (iRet != 0) { fprintf(stderr, "error WSAStartup %d\n", iRet); return 1; } printf("wVersion=[%#.2x,%#.2x]\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); printf("wHighVersion=[%#.2x,%#.2x]\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); printf("szDescription=[%s]\n", wsaData.szDescription); printf("szSystemStatus=[%s]\n", wsaData.szSystemStatus); WSACleanup(); return 0; } 出力 wVersion=[0x02,0x02] wHighVersion=[0x02,0x02] szDescription=[WinSock 2.0] szSystemStatus=[Running]
https://w.atwiki.jp/sampleisbest/pages/155.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 dshow2 アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode 参考 音声付き動画をフルスクリーンで再生する ウィンドウレス モードの使い方 Enhanced Video Rendererを使ってみよう dshow2.cpp // Unicode文字セット #pragma comment(lib, "strmiids.lib") #include DShow.h #include evr.h #define SAFE_RELEASE(x) { if (x) { x- Release(); x = NULL; } } #define CLASS_NAME TEXT("dshow2") #define WINDOW_NAME TEXT("dshow2") // 関数プロトタイプ宣言 HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName); HRESULT InitEvr(HWND hWnd); HRESULT SetVideoPos(HWND hWnd, int nMode); LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // 外部変数構造体 static struct { IGraphBuilder *pGraph; IMediaControl *pControl; IMFVideoDisplayControl *pVideo; SIZE size; int nPlay; } g; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcx; HWND hWnd; MSG msg = {NULL}; HRESULT hr; // COMライブラリの初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return 0; } // ウィンドウクラスの登録 ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= MainWndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1);// 黒がいいかも wcx.lpszClassName= CLASS_NAME; if (RegisterClassEx( wcx) == 0) { goto Exit; } // ウィンドウの作成 hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW, //CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { goto Exit; } // DirectShowフィルタの準備 hr = OpenFile(hWnd, L"c \\tmp\\hoge.mp4"); if (FAILED(hr)) { goto Exit; } ShowWindow(hWnd, nCmdShow); // 動画再生 hr = g.pControl- Run(); g.nPlay = 1; // メッセージループ do { Sleep(1); if (PeekMessage( msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } } while (msg.message != WM_QUIT); // 動画停止 hr = g.pControl- Stop(); Sleep(1000); Exit SAFE_RELEASE(g.pVideo); SAFE_RELEASE(g.pControl); SAFE_RELEASE(g.pGraph); CoUninitialize(); return msg.wParam; } //------------------------------------------------------------------------------ HRESULT OpenFile(HWND hWnd, LPCWSTR pszFile) { // フィルタグラフの作成 HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pGraph)); // メディアコントロールインターフェイスの取得 if (SUCCEEDED(hr)) { hr = g.pGraph- QueryInterface(IID_PPV_ARGS( g.pControl)); } // ビデオの作成 if (SUCCEEDED(hr)) { hr = InitEvr(hWnd); } // グラフを作成する if (SUCCEEDED(hr)) { hr = g.pGraph- RenderFile(pszFile, NULL); } // 描画領域の設定 if (SUCCEEDED(hr)) { g.pVideo- GetNativeVideoSize( g.size, NULL); } if (SUCCEEDED(hr)) { hr = SetVideoPos(hWnd, 2); } return hr; } //------------------------------------------------------------------------------ HRESULT InitEvr(HWND hWnd) { IBaseFilter *pEvr = NULL; // EVRの作成 HRESULT hr = CoCreateInstance(CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( pEvr)); // フィルタグラフにEVRを追加 if (SUCCEEDED(hr)) { hr = g.pGraph- AddFilter(pEvr, L"EVR"); } IMFGetService *pService = NULL; if (SUCCEEDED(hr)) { hr = pEvr- QueryInterface(IID_PPV_ARGS( pService)); } if (SUCCEEDED(hr)) { hr = pService- GetService(MR_VIDEO_RENDER_SERVICE, IID_PPV_ARGS( g.pVideo)); } SAFE_RELEASE(pService); if (SUCCEEDED(hr)) { hr = g.pVideo- SetVideoWindow(hWnd); } SAFE_RELEASE(pEvr); return hr; } //------------------------------------------------------------------------------ HRESULT SetVideoPos(HWND hWnd, int nMode) { MFVideoNormalizedRect mvnr = {0.0f, 0.0f, 1.0f, 1.0f}; RECT rcDst; if (1 = nMode nMode = 4) { SetRect( rcDst, 0, 0, g.size.cx * nMode / 2, g.size.cy * nMode / 2); AdjustWindowRectEx( rcDst, WS_OVERLAPPEDWINDOW, FALSE, 0); SetWindowPos(hWnd, NULL, 0, 0, rcDst.right - rcDst.left, rcDst.bottom - rcDst.top, SWP_NOZORDER | SWP_NOMOVE); } GetClientRect(hWnd, rcDst); return g.pVideo- SetVideoPosition( mvnr, rcDst); } //------------------------------------------------------------------------------ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CHAR switch (wParam) { case VK_SPACE if (g.nPlay) { g.pControl- Pause(); g.nPlay = 0; } else { g.pControl- Run(); g.nPlay = 1; } break; case s g.pControl- StopWhenReady(); g.nPlay = 0; break; case 1 case 2 case 3 case 4 SetVideoPos(hWnd, wParam - 0 ); break; case VK_ESCAPE DestroyWindow(hWnd); break; } break; case WM_SIZE SetVideoPos(hWnd, 0); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } dshow2_fullscreen.cpp +... // Unicode文字セット #pragma comment(lib, "strmiids.lib") #pragma comment(lib, "d3d9.lib") #include DShow.h #include d3d9.h #include vmr9.h #define SAFE_RELEASE(x) { if (x) { x- Release(); x = NULL; } } #define CLASS_NAME TEXT("dshow2") #define WINDOW_NAME TEXT("dshow2") // 関数プロトタイプ宣言 HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName); LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // 外部変数構造体 static struct { IGraphBuilder *pGraph; IMediaControl * pControl; IBaseFilter *pVideo; IVMRWindowlessControl9 *pWndless; ICaptureGraphBuilder2 *pCapture; } g; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcx; HWND hWnd; MSG msg = {NULL}; HRESULT hr; // COMの初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { goto Exit; } // ウィンドウクラスの登録 ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= MainWndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1);// 黒がいいかも wcx.lpszClassName= CLASS_NAME; if (RegisterClassEx( wcx) == 0) { goto Exit; } // ウィンドウの作成 hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME, WS_POPUPWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, //100, 100, 640, 480, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { goto Exit; } //---------------------------------------------------------------------- LPDIRECT3D9 pD3D = NULL; LPDIRECT3DDEVICE9 pD3DDev = NULL; D3DPRESENT_PARAMETERS d3dpp; // Direct3Dの初期化 pD3D = Direct3DCreate9(D3D_SDK_VERSION); if (pD3D == NULL) { goto Exit; } ZeroMemory( d3dpp, sizeof d3dpp); d3dpp.BackBufferWidth= GetSystemMetrics(SM_CXSCREEN); d3dpp.BackBufferHeight= GetSystemMetrics(SM_CYSCREEN); d3dpp.BackBufferFormat= D3DFMT_A8R8G8B8; //d3dpp.MultiSampleType= D3DMULTISAMPLE_NONE;// 0 d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD;// 1 d3dpp.hDeviceWindow= hWnd; d3dpp.Windowed= FALSE;// windowed / full-screen //d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;// 0 //d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;// 0 hr = pD3D- CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, d3dpp, pD3DDev); if (FAILED(hr)) { goto Exit; } // DirectShowフィルタの準備 hr = OpenFile(hWnd, L"c \\tmp\\hoge.mp4"); if (FAILED(hr)) { goto Exit; } //---------------------------------------------------------------------- ShowWindow(hWnd, nCmdShow); // 動画再生 hr = g.pControl- Run(); // メッセージループ do { Sleep(1); if (PeekMessage( msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } } while (msg.message != WM_QUIT); // 動画停止 hr = g.pControl- Stop(); Sleep(1000); Exit SAFE_RELEASE(g.pCapture); SAFE_RELEASE(g.pWndless); SAFE_RELEASE(g.pVideo); SAFE_RELEASE(g.pControl); SAFE_RELEASE(g.pGraph); SAFE_RELEASE(pD3DDev); SAFE_RELEASE(pD3D); CoUninitialize(); return msg.wParam; } //------------------------------------------------------------------------------ HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName) { //---------------------------------------------------------------------- // InitGraph // フィルタグラフの作成 HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pGraph)); // メディアコントロールインターフェイスの取得 if (SUCCEEDED(hr)) { hr = g.pGraph- QueryInterface(IID_PPV_ARGS( g.pControl)); } //---------------------------------------------------------------------- // ソースフィルタの生成と登録 IBaseFilter *pSource = NULL; if (SUCCEEDED(hr)) { hr = g.pGraph- AddSourceFilter(pszFileName, NULL, pSource); } //---------------------------------------------------------------------- // RenderStreams // AddFilterByCLSID // VMR9フィルタの作成と登録 if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pVideo)); } if (SUCCEEDED(hr)) { hr = g.pGraph- AddFilter(g.pVideo, L"VMR-9"); } //---------------------------------------------------------------------- // InitWindowlessVMR9 // VMR9をウィンドウレスモードにする IVMRFilterConfig *pConfig = NULL;// IVMRFilterConfig9 if (SUCCEEDED(hr)) { hr = g.pVideo- QueryInterface(IID_IVMRFilterConfig9, (LPVOID *) pConfig); } if (SUCCEEDED(hr)) { hr = pConfig- SetRenderingMode(VMRMode_Windowless);// VMR9Mode_Windowless = 2 } // 描画ウィンドウの指定 if (SUCCEEDED(hr)) { hr = g.pVideo- QueryInterface(IID_PPV_ARGS( g.pWndless)); } if (SUCCEEDED(hr)) { hr = g.pWndless- SetVideoClippingWindow(hWnd); } // pWndless- SetAspectRatioMode(VMR9ARMode_LetterBox); SAFE_RELEASE(pConfig); //---------------------------------------------------------------------- // CaptureGraphBuilder2インターフェイスの取得 if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pCapture)); } if (SUCCEEDED(hr)) { hr = g.pCapture- SetFiltergraph(g.pGraph); } // フィルタの接続 if (SUCCEEDED(hr)) { hr = g.pCapture- RenderStream(NULL, NULL, pSource, NULL, g.pVideo); } if (SUCCEEDED(hr)) { hr = g.pCapture- RenderStream(NULL, MEDIATYPE_Audio, pSource, NULL, NULL); } // 描画領域の設定 LONG lWidth, lHeight; RECT rcSrc, rcDst; if (SUCCEEDED(hr)) { hr = g.pWndless- GetNativeVideoSize( lWidth, lHeight, NULL, NULL); } if (SUCCEEDED(hr)) { SetRect( rcSrc, 0, 0, lWidth, lHeight); GetClientRect(hWnd, rcDst); hr = g.pWndless- SetVideoPosition( rcSrc, rcDst); } SAFE_RELEASE(pSource); return hr; } //------------------------------------------------------------------------------ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CHAR if (wParam == VK_ESCAPE) { DestroyWindow(hWnd); } break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; } dshow2_vmr9.cpp +... // Unicode文字セット #pragma comment(lib, "strmiids.lib") #include DShow.h #include d3d9.h #include vmr9.h #define SAFE_RELEASE(x) { if (x) { x- Release(); x = NULL; } } #define CLASS_NAME TEXT("dshow2") #define WINDOW_NAME TEXT("dshow2") // 関数プロトタイプ宣言 HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName); HRESULT InitWndlessVMR(HWND hWnd, IGraphBuilder *pGraph, IVMRWindowlessControl9 **ppWndless); HRESULT SetVideoPos(HWND hWnd, int nMode); LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // 外部変数構造体 static struct { IGraphBuilder *pGraph; IMediaControl *pControl; IVMRWindowlessControl9 *pWndless; SIZE size; int nPlay; } g; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcx; HWND hWnd; MSG msg = {NULL}; HRESULT hr; // COMライブラリの初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return 0; } // ウィンドウクラスの登録 ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= MainWndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); //wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1);// 黒がいいかも wcx.lpszClassName= CLASS_NAME; if (RegisterClassEx( wcx) == 0) { goto Exit; } // ウィンドウの作成 hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW, //CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { goto Exit; } // DirectShowフィルタの準備 hr = OpenFile(hWnd, L"c \\tmp\\hoge.mp4"); if (FAILED(hr)) { goto Exit; } ShowWindow(hWnd, nCmdShow); // 動画再生 hr = g.pControl- Run(); g.nPlay = 1; // メッセージループ do { Sleep(1); if (PeekMessage( msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } } while (msg.message != WM_QUIT); // 動画停止 hr = g.pControl- Stop(); Sleep(1000); Exit SAFE_RELEASE(g.pWndless); SAFE_RELEASE(g.pControl); SAFE_RELEASE(g.pGraph); CoUninitialize(); return msg.wParam; } //------------------------------------------------------------------------------ HRESULT OpenFile(HWND hWnd, LPCWSTR pszFile) { // フィルタグラフの作成 HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pGraph)); // メディアコントロールインターフェイスの取得 if (SUCCEEDED(hr)) { hr = g.pGraph- QueryInterface(IID_PPV_ARGS( g.pControl)); } // ウィンドウレスコントロールの作成 if (SUCCEEDED(hr)) { hr = InitWndlessVMR(hWnd, g.pGraph, g.pWndless); } // グラフを作成する if (SUCCEEDED(hr)) { hr = g.pGraph- RenderFile(pszFile, NULL); } // 描画領域の設定 if (SUCCEEDED(hr)) { hr = g.pWndless- GetNativeVideoSize( g.size.cx, g.size.cy, NULL, NULL); } if (SUCCEEDED(hr)) { hr = SetVideoPos(hWnd, 2); } return hr; } //------------------------------------------------------------------------------ HRESULT InitWndlessVMR(HWND hWnd, IGraphBuilder *pGraph, IVMRWindowlessControl9 **ppWndless) { IBaseFilter *pVmr = NULL; IVMRWindowlessControl9 *pWndless = NULL; if (!pGraph || !ppWndless) { return E_POINTER; } // VMRを作成する HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( pVmr)); // フィルタグラフにVMRを追加する if (SUCCEEDED(hr)) { hr = pGraph- AddFilter(pVmr, L"VMR-9"); } // レンダリングモードを設定する IVMRFilterConfig9 *pConfig = NULL; if (SUCCEEDED(hr)) { hr = pVmr- QueryInterface(IID_IVMRFilterConfig9, (LPVOID *) pConfig); } if (SUCCEEDED(hr)) { hr = pConfig- SetRenderingMode(VMR9Mode_Windowless); } SAFE_RELEASE(pConfig); // ウィンドウを設定する if (SUCCEEDED(hr)) { hr = pVmr- QueryInterface(IID_PPV_ARGS( pWndless)); } if (SUCCEEDED(hr)) { hr = pWndless- SetVideoClippingWindow(hWnd); if (SUCCEEDED(hr)) { *ppWndless = pWndless; } else { SAFE_RELEASE(pWndless); } } // pWndless- SetAspectRatioMode(VMR9ARMode_LetterBox); SAFE_RELEASE(pVmr); return hr; } //------------------------------------------------------------------------------ HRESULT SetVideoPos(HWND hWnd, int nMode) { RECT rcSrc; RECT rcDst; SetRect( rcSrc, 0, 0, g.size.cx, g.size.cy); if (1 = nMode nMode = 4) { SetRect( rcDst, 0, 0, rcSrc.right * nMode / 2, rcSrc.bottom * nMode / 2); AdjustWindowRectEx( rcDst, WS_OVERLAPPEDWINDOW, FALSE, 0); SetWindowPos(hWnd, NULL, 0, 0, rcDst.right - rcDst.left, rcDst.bottom - rcDst.top, SWP_NOZORDER | SWP_NOMOVE); } GetClientRect(hWnd, rcDst); return g.pWndless- SetVideoPosition( rcSrc, rcDst); } //------------------------------------------------------------------------------ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CHAR switch (wParam) { case VK_SPACE if (g.nPlay) { g.pControl- Pause(); g.nPlay = 0; } else { g.pControl- Run(); g.nPlay = 1; } break; case s g.pControl- StopWhenReady(); g.nPlay = 0; break; case 1 case 2 case 3 case 4 SetVideoPos(hWnd, wParam - 0 ); break; case VK_ESCAPE DestroyWindow(hWnd); break; } break; case WM_SIZE SetVideoPos(hWnd, 0); break; case WM_DESTROY PostQuitMessage(0); break; default return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
https://w.atwiki.jp/sampleisbest/pages/519.html
開発環境 Microsoft Visual Studio Community 2017 実行環境 Microsoft Windows 10 Home (64-bit) プロジェクトの種類 Visual C++ / 空のプロジェクト プロジェクト名 waveloop2 参考 WAVEのマルチバッファリング ループ再生と一時停止 waveloop2.cpp // プロジェクトのプロパティ // Unicode文字セット #pragma comment(lib, "winmm") #include Windows.h #include wchar.h #include "Resource.h" #define SAMPLE_RATE 44100 #define BUFFERS 2 #define BUF_LEN 2048 // 関数プロトタイプ宣言 void Trace(LPCWSTR format, ...); INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); void Play(HWND hDlg); void Stop(HWND hDlg); void GenerateWaveForm(LPWAVEHDR pwh); // グローバル変数 HWAVEOUT hwo = NULL; WAVEHDR wh[BUFFERS]; BYTE waveform[BUFFERS][BUF_LEN]; bool playing = false; int phase; int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDLG), NULL, MainDlg); return 0; } void Trace(LPCWSTR format, ...) { va_list arg_ptr; WCHAR buffer[256]; va_start(arg_ptr, format); int size = _vsnwprintf_s(buffer, _TRUNCATE, format, arg_ptr); va_end(arg_ptr); OutputDebugString(buffer); } INT_PTR CALLBACK MainDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { INT_PTR ret = TRUE;// メッセージを処理した switch (message) { case MM_WOM_DONE if (playing) GenerateWaveForm((LPWAVEHDR)lParam); break; //case MM_WOM_OPEN //case MM_WOM_CLOSE case WM_COMMAND switch (LOWORD(wParam)) { case IDC_PLAY Play(hDlg); break; case IDC_STOP Stop(hDlg); break; case IDCANCEL EndDialog(hDlg, IDCANCEL); break; } break; case WM_INITDIALOG ret = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE Stop(hDlg); ret = FALSE; break; default ret = FALSE;// メッセージを処理しなかった } return ret; } void Play(HWND hDlg) { MMRESULT mmr; Trace(L"Play()\n"); EnableWindow(GetDlgItem(hDlg, IDC_PLAY), FALSE); playing = true; WAVEFORMATEX wfx; wfx.wFormatTag = WAVE_FORMAT_PCM; wfx.nChannels = 1; wfx.nSamplesPerSec = SAMPLE_RATE; wfx.nAvgBytesPerSec = SAMPLE_RATE; wfx.nBlockAlign = 1; wfx.wBitsPerSample = 8; wfx.cbSize = 0; mmr = waveOutOpen( hwo, WAVE_MAPPER, wfx, (DWORD_PTR)hDlg, NULL, CALLBACK_WINDOW); Trace(L"waveOutOpen %u\n", mmr); phase = 0; for (int i = 0; i BUFFERS; i++) { LPWAVEHDR pwh = wh + i; pwh- lpData = (LPSTR)(waveform[i]); pwh- dwBufferLength = BUF_LEN; pwh- dwFlags = 0; mmr = waveOutPrepareHeader(hwo, pwh, sizeof WAVEHDR); Trace(L"waveOutPrepareHeader %d %u\n", i, mmr); GenerateWaveForm(pwh); } } void Stop(HWND hDlg) { Trace(L"Stop()\n"); EnableWindow(GetDlgItem(hDlg, IDC_PLAY), TRUE); playing = false; if (hwo) { MMRESULT mmr; mmr = waveOutReset(hwo); Trace(L"waveOutReset %u\n", mmr); for (int i = 0; i BUFFERS; i++) { mmr = waveOutUnprepareHeader(hwo, wh + i, sizeof WAVEHDR); Trace(L"waveOutUnprepareHeader %d %u\n", i, mmr); } mmr = waveOutClose(hwo); Trace(L"waveOutClose %u\n", mmr); hwo = NULL; } } void GenerateWaveForm(LPWAVEHDR pwh) { LPBYTE data = (LPBYTE)(pwh- lpData); for (int i = 0; i BUF_LEN; i++) { phase += 440; if (SAMPLE_RATE = phase) phase -= SAMPLE_RATE; double t = phase / (double)SAMPLE_RATE; data[i] = 128 + (t 0.5 ? 1 -1) * 10; } waveOutWrite(hwo, pwh, sizeof WAVEHDR); } Resource.h #define IDD_MAINDLG100 #define IDC_STATIC-1 #define IDC_PLAY1000 #define IDC_STOP1001 waveloop2.rc // resource script #include windows.h #include "resource.h" IDD_MAINDLG DIALOGEX 100, 100, 320, 200 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION "waveloop2" FONT 9, "MS UI Gothic" BEGIN PUSHBUTTON"Play( P)", IDC_PLAY, 10, 10, 50, 15 PUSHBUTTON"Stop( S)", IDC_STOP, 70, 10, 50, 15 END