Windows CE 5.0で動作するソフトでボリュームの制御

このQ&Aのポイント
  • Windows CE 5.0で動作するソフトでボリュームの制御をする事になり、色々なサイトで調べた結果、waveOut関数を使用すると制御できることがわかりました。
  • ソースコードを示し、デバイスのオープン、クローズ、ボリュームのオン/オフ、最大値の設定方法を説明しました。
  • VC++2005とWindows CE 5.0を使用しており、制御がうまくいかない問題に困っています。助言を求めています。
回答を見る
  • ベストアンサー

Windows CE 5.0で動作するソフトでボリュームの制御

Windows CE 5.0で動作するソフトでボリュームの制御 Windows CE 5.0で動作するソフトでボリュームの制御をする事になり、色々なサイトで調べたところ、waveOut○○○関数で出来るとあったので、まずPC(XP)で制御できる事を確認し、そのまま移植したのですが、制御できなくて困っています。 ソースは以下の通りです。 //--- デバイスのオープン --- BOOL C×××Dlg::waveOutCtrlOpen() { WAVEFORMATEX wfe; MMRESULT mmRes; TCHAR str[MAXERRORLENGTH]; wfe.wFormatTag = WAVE_FORMAT_PCM; wfe.nChannels = 2; //ステレオ wfe.wBitsPerSample = 16; //量子化ビット数 wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample/8; wfe.nSamplesPerSec = 44100; //標本化周波数 wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlign; wfe.cbSize = 0; mmRes = waveOutOpen(&m_hWaveOut,WAVE_MAPPER,&wfe,0,0,CALLBACK_NULL); if(mmRes!=MMSYSERR_NOERROR) { waveOutGetErrorText(mmRes,str,MAXERRORLENGTH); MessageBox(str,_T("waveOutOpen Error"),MB_OK); return FALSE; } m_blnWaveOutCtrlOpen = TRUE; return TRUE; } //--- デバイスのクローズ --- void C×××Dlg::waveOutCtrlClose() { MMRESULT mmRes; TCHAR str[MAXERRORLENGTH]; if( m_blnWaveOutCtrlOpen == TRUE ) { mmRes = waveOutClose(m_hWaveOut); if(mmRes!=MMSYSERR_NOERROR) { waveOutGetErrorText(mmRes,str,MAXERRORLENGTH); MessageBox(str,_T("waveOutClose Error"),MB_OK); } } } //--- ボリュームOFF --- void C×××Dlg::OnBnClickedButton1() { MMRESULT mmRes; TCHAR str[MAXERRORLENGTH]; mmRes = waveOutSetVolume(m_hWaveOut, 0); if(mmRes!=MMSYSERR_NOERROR) { waveOutGetErrorText(mmRes,str,MAXERRORLENGTH); MessageBox(str,_T("waveOutSetVolume"),MB_OK); } } //--- ボリュームMAX --- void C×××Dlg::OnBnClickedButton2() { MMRESULT mmRes; TCHAR str[MAXERRORLENGTH]; mmRes = waveOutSetVolume(m_hWaveOut, 65535); if(mmRes!=MMSYSERR_NOERROR) { waveOutGetErrorText(mmRes,str,MAXERRORLENGTH); MessageBox(str,_T("waveOutSetVolume"),MB_OK); } } //--- waveOutGetDevCaps()で取得したデバイス情報 --- wMid(機器のメーカーのメーカー識別子):1 wPid(機器の製品識別子):24 vDriverVersion(機器のバージョン番号):1 szPname(製品名):AudioOutput dwFormats(サポートされる標準のフォーマット(WAVE_FORMAT_...)):4095 wChannels(オーディオのチャンネルの数(1:Mono 2:Stereo)):2 dwSupport(オプションの機能):14 環境 VC++2005 Windows CE 5.0 大変困っています。 どなたか助言をお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  解決になるかどうかは判りませんが、mixer???API()が「windows ce 5.0」でも使用出来るようですので、マスターボリュームを動かして見ては如何でしょうか。  http://msdn.microsoft.com/en-us/library/ms925310.aspx  具体的なプログラムは以下URLです。  http://okwave.jp/qa/q5067186.html  SetMasterVolumeValance(32, 32);//ボリュームを左右ともに32にする。  といった具合です。

taka077
質問者

お礼

回答、ありがとうございます。 実は、色々なサイトを検索してる時、スピーカー制御(上記のURLと同じ事をやっている)を見つけたので試したのですが、mixerGetNumDevs() が0となってしまうのです。 (PCでは正常に動作は確認しています。)

関連するQ&A

  • アドレス

    利用環境はMFCのVC++6.0です。 void CTestDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) { CString str; int num=m_list.GetSelectionMark(); str=m_list.GetItemText(num,0); if(Tstr!=NULL){ *Tstr=str; } CTest2 dlg2; dlg2.DoModal(); ・ ・ ・ } ヘッダ:CString *Tstr; とすると*Tstr=str;がおかしいらしく、アドレスがきちんと渡っていないようです。Tstr!=NULLの所ではアドレスは0xcccccc"???"となっていて if文は意味をなしません。 値を受け取るダイアログでは CTest Tdlg; CString aa; Tdlg.Tstr=&aa; MessageBox(aa); としています。 TestDlgのリストビューの内容をうけとりそれを新しくダイアログを作って そちらに移すプログラムです。

  • 宣言による処理の重さ

    第161章 キーボード・フック http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm このサイトのLRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp)で {   char str[256];   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } と書いてありますが、char str[256];をstatic char str[256];にしたり、 {   if (nCode < 0)     return CallNextHookEx(hMyHook, nCode, wp, lp);   if (wp >= 0x30 && wp <= 0x39) {     char str[256];     wsprintf(str, "hMyHook = %d", hMyHook);     MessageBox(NULL, str, "MyHookProc", MB_OK);     return CallNextHookEx(hMyHook, nCode, wp, lp);   }   wsprintf(str, "キー入力はインターセプトされました\n フックハンドル= %d", hMyHook);   MessageBox(NULL, str, "インターセプト", MB_OK);   return TRUE; } にするとアプリケーションのパフォーマンスはよくなりますか?

  • 変数アクセス(MFC)

    クラス別の変数間のアクセスについてよくわかりません。 【CADlg.cpp】 void CADlg::OnOK() { CB bdlg; CString str; m_ed.GetwindowText(str); Astr=&str; cdlg.DoModal(); CDialog::OnOK(); } 【CADlg.h】 public: CString *Astr; 【CB.cpp】 void CB::OnOK() { CStr CADlg dlg; dlg.Astr=&bstr;; MessageBox(bstr); CDialog::OnOK(); } 【CB.h】 CString bstr; 中身見てもちゃんと移ってないようです。 どうすればちゃんとできますでしょうか?

  • 今DirectSoundの初期化でわからないことがあります。カレントデ

    今DirectSoundの初期化でわからないことがあります。カレントディレクトリにもsoundファイルにもwavファイルがあるのにうまく読み込まれません。また、mmioRead関数でなぜか失敗時の処理が出てしまいます。下に一部省略したソースを書きます。 if(FAILED(hr = OpenWaveFile(aWaveFileName, aSound))) { TCHAR strWavFile[MAX_PATH]; TCHAR kSoundsPath[6]={'s','o','u','n','d','/'}; int kSoundsPathLength=6; lstrcpyn(strWavFile, kSoundsPath, MAX_PATH); lstrcpyn(strWavFile + kSoundsPathLength, aWaveFileName, MAX_PATH - kSoundsPathLength); if(FAILED(hr = OpenWaveFile((LPSTR)strWavFile, aSound))) { sprintf(tmpString, "wavファイル『%s』が見つかりませんでした", strWavFile); goto FAIL_RETURN; } HRESULT Sound::OpenWaveFile(LPSTR aWaveFileName, theSounds *aSound) { mmioOpen→mmioDescend →aChunkInfo.ckid = mmioFOURCC('f', 'm', 't', ' '); if(MMSYSERR_NOERROR != mmioDescend(aSound->sndHmmio, &aChunkInfo, &(aSound->sndChunkRiff), MMIO_FINDCHUNK)) { MessageBox(NULL, "FAIL:mmioDescend2","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return(E_FAIL); } →if(mmioRead(aSound->sndHmmio, (HPSTR) &aPCMWaveFormat, sizeof(aPCMWaveFormat)) != sizeof(aPCMWaveFormat)) { MessageBox(NULL, "FAIL:mmioRead","エラー", MB_OK | MB_ICONHAND); CloseWaveFile(aSound); return (E_FAIL); } } ソースは以上です。誰か原因に心当たりがある方がいましたら回答お願いします。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • _tcscat がうまくいきません(VC++2008)

    以下のように入力し、ビルドすると 「error C2664: 'wcscat' : 1 番目の引数を 'LPCTSTR' から 'wchar_t *' に変換できません。」となり、うまくいきません。 ダイアログに「テストです。」と表示させたいです。一体どうしたらよいのでしょうか?ご教授ください~。 環境は、WindowsXP SP2 & Visual C++ 2008 Express Edition です。 なお、文字セットは「Unicode 文字セットを使用する」に設定してあります。 //----------------------------------------------------------- #include <Windows.h> #include <tchar.h> INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE,LPSTR,INT){ LPCTSTR str1 = _T("テスト"); LPCTSTR str2 = _T("です。"); _tcscat( str1, str2 ); MessageBox(NULL,str1,_T("Dialog"),MB_OK); return 0; }

  • midiの再生が思うようにできません

    ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。 環境:WindowsXP, Visual C++ 2008 Express Edition 以下がプログラムのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { FILE *fp; errno_t err; TCHAR buf[30]; TCHAR *temp; int m=0, n=0; switch(msg) { case WM_CREATE: CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL); break; case WM_COMMAND: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } for(int i=0; i<2; i++){ _fgetts(buf, 10, fp); _tcstok(buf, TEXT("\n")); } while(_fgetts(buf, 30, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ if((m>=0 && m<110)&&(n>=0 && n<200)){ if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=0 && n<200)){ if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=220 && m<330)&&(n>=0 && n<200)){ if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=330 && m<440)&&(n>=0 && n<200)){ if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=440 && m<550)&&(n>=0 && n<200)){ if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=550 && m<660)&&(n>=0 && n<200)){ if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=660 && m<770)&&(n>=0 && n<200)){ if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; }else if((m>=110 && m<220)&&(n>=200 && n<400)){ if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0) { MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK); SendMessage(hWnd, WM_CLOSE, 0, 0); } return 0; 以下省略 . . . }else{ break; } } } free(temp); fclose(fp); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

  • 複数ファイルを1つにまとめる コード添削願い

    複数のファイルを1つのファイルにまとめようとがんばっています。 リストボックスを用意し、ファイル一覧をつくり、 そこからアドレスを取得して、まとめていくという手順です。 ただ、最後のWriteFile関数の部分で、書き込みが出来ずエラーが返ります。 なぜかが分かりません。 ご教授お願いします。 Dim num As Long Dim buf As BytePtr Dim hFile As HANDLE Dim n As Long Dim LastFileSize As Long num=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETCOUNT,0,0) For n=0 to num-1 Step 1 'ファイル名を取得 Dim name As BytePtr Dim len As Long Dim s As String Dim path As String Dim FileSize As Long Dim dwAccessByte As DWord len=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXTLEN,n,0)+1 name=malloc(len) SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXT,n,name) s=MakeStr(name) free(name) 'ファイルパスを連結し、読み込む path=str+"\"+s 'ファイルハンドルの作成 hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error File Number Is "+Str$(n)+" .",MB_OK or MB_ICONWARNING) Exit Sub End If 'ファイルのサイズの取得 FileSize=GetFileSize(hFile,0) LastFileSize=LastFileSize+FileSize '領域確保 If n=0 Then buf=malloc(FileSize+1) Else buf=realloc(buf,FileSize+1) End If 'ファイルの読み込み If ReadFile(hFile,buf,FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING) End If 'ファイル名とサイズを記録 Open dir+"\FileInfo.txt" For Append As #1 Print #1,s+"="+Str$(FileSize) Close #1 CloseHandle(hFile) Next hFile=CreateFile(dir+"\game.test",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error File Number Is At Last",MB_OK or MB_ICONWARNING) Exit Sub End If If WriteFile(hFile,buf,LastFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then MessageBox(hMainWnd,"ファイル作成時にエラーが発生しました!!","Last Error",MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Str$(LastFileSize)+","+Str$(dwAccessByte),0,0) End If CloseHandle(hFile) free(buf) MessageBox(hMainWnd,"処理終了","End",MB_OK or MB_ICONINFORMATION)

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • ソケット通信時のWSACleanup処理のエラーについて

    はじめまして。 現在、C++ Builder ver6.0 にて、ソケット通信のプログラムを作成しているのですが、受信処理を一定回数行うとwinsockのリソースを解放するWSACleanupが失敗してしまいます。1ファイル受信するごとに下記のソケットの初期化処理を入れています。 bool __fastcall CUdpSock::Init(void) {   WORD wVersionRequested; // socket version   int errorStatus;   WSADATA wsaData;   /* WinSockの初期化を行う */   wVersionRequested = MAKEWORD(1, 1); // バージョン 1.1 を要求する   nErrorStatus = WSAStartup(wVersionRequested, &wsaData);   if ( nErrorStatus != 0 )   {     m_msg.printf("WinSockの初期化失敗\n");     Application->MessageBox(m_msg.c_str(), "ソケットの初期化", MB_ICONINFORMATION | MB_OK);     return false;   }   if (atexit((void (*)(void))(WSACleanup))) // 終了時にWinSockのリソースを解放するようにしておく   {     m_msg.printf("atexit(WSACleanup)失敗\n");     Application->MessageBox(m_msg.c_str(), "ソケットの初期化", MB_ICONINFORMATION | MB_OK);     return false;   }   return true; } 現状、32回連続で受信した後、上記のWSACleanupで失敗になっています。 このような現象の場合、まずどのあたりを疑うべきでしょうか? 曖昧ですがご教授よろしくお願いします。