ページ 1 / 1
MCIコマンド助けて!
Posted: 2012年12月14日(金) 15:30
by 神族
MIDI再生はできたけど何故かMP3が再生できない・・・ (´・ω・`)ショボーン
一応コンパイルエラーとMCIのエラーは、ありませんでした。どうしればいいのか教えて下さい! 。・゚゚・(≧д≦)・゚゚・。エーン!!
コード:
char buf[1000];
DWORD dwFlags=0;
MCI_OPEN_PARMS mop;
dwFlags|=MCI_OPEN_TYPE;
mop.lpstrDeviceType="MPEGVideo";
dwFlags|=MCI_OPEN_ELEMENT;
mop.lpstrElementName="test.mp3";
dwFlags|=MCI_WAIT;
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
}else{
mciGetErrorString(ret,buf,sizeof(buf));
MessageBox::Show(gcnew String(buf),"error");
}
Re: MCIコマンド助けて!
Posted: 2012年12月14日(金) 19:05
by softya(ソフト屋)
MCI_PLAYのエラーをチェックしていないようですが?
Re: MCIコマンド助けて!
Posted: 2012年12月14日(金) 21:36
by 神族
softya(ソフト屋) さんが書きました:MCI_PLAYのエラーをチェックしていないようですが?
どうしればMCI_PLAYのエラー確認できますか?
Re: MCIコマンド助けて!
Posted: 2012年12月14日(金) 21:39
by softya(ソフト屋)
それは、MCI_OPENと同じ仕組みで良いはずですが。
Re: MCIコマンド助けて!
Posted: 2012年12月14日(金) 23:23
by 神族
softya(ソフト屋) さんが書きました:それは、MCI_OPENと同じ仕組みで良いはずですが。
コード:
mciGetErrorString(ret,buf,sizeof(buf));
のは駄目なんですか?
Re: MCIコマンド助けて!
Posted: 2012年12月14日(金) 23:26
by softya(ソフト屋)
MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 00:12
by 神族
softya(ソフト屋) さんが書きました:MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
あああwてことはMCI_PLAYにも同じようにエラー探せばいいのですね?試してエラー探してみます
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 00:49
by 神族
softya(ソフト屋) さんが書きました:MCI_OPENは
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
if(ret==0){
で戻り値をチェックしてますが、MCI_PLAYの
mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);
は何もしてませんよね?
エラー探してみたら何も発生しなかった。・・・って言うかIF無しで普通にエラー確認の出そうとしても何故か表示しない・・・・・・・・・
俺の予想ではmciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);に止まってる?かもしれない・・・ (・ω・ ;)
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 01:39
by softya(ソフト屋)
すいません。さっぱり分かりません。
どの様なプログラムを実行して、結果はどうなったか教えて下さい。
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 15:42
by 神族
ちょっとコード変えてドラッグアンドドロップ対応したMCI作ってみたんだけどやはり前のコードと同じくMP3が再生駄目みたい・・・(MIDIは再生できてる)
ドラッグエンターは俺がOKした拡張子のみにしてるので問題ないです。
コード:
//文字列配列
static array<System::String^>^ files;
static array<System::String^>^ iType={".3g2",".3gp",".3gp2",".3gpp",".aac",
".adt",".adts",".aif",".aifc",".aiff",
".asf",".asx",".au",".dat",".ivf",
".m1v",".m2t",".m2ts",".m2v",".m3u",
".m4a",".m4v",".mod",".mov",".mp2",
".mp2v",".mp3",".mp4",".mp4v",".mpa",
".mpe",".mpeg",".mpg",".mpv2",".mts",
".snd",".ts",".tts",".wax",".wm",
".wma",".wmv",".wmx",".wpl",".wvx",
".avi",".cda",".wav",".mid",".midi",
".rmi"
};
//ファイルドラッグアンドドロップ
private: System::Void Form1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) {
//if
if(e ->Data ->GetDataPresent(DataFormats::FileDrop)){//もしファイルドロップされた場合
//文字列配列
files=array<System::String^>(e->Data->GetData(DataFormats::FileDrop , false));
//if
if(setPlayer((char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(findType(0)).ToPointer(),
(char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(files[0]).ToPointer())==true){
//playMusicメソッド
playMusic();//playMusicメソッド呼び出し
}
}//if終了
}//メソッド終了
//playMusicメソッド
private: void playMusic(){
//char配列
char buf[1000];
//MCI
MCIERROR ret=mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);//MCIコマンド
//if
if(ret){//もしエラーがある場合
//エラー内容取得
mciGetErrorString(ret,buf,sizeof(buf));
//エラー内容をメッセージボックスに表示
MessageBox::Show(gcnew String(buf),"error");
}//if終了
}//playMusicメソッド終了
//setPlayerメソッド
private: bool setPlayer(char* type,char* file){
//char配列
char buf[1000];
//DWORD
DWORD dwFlags=0;
//MCIのオープンタイプ設定
dwFlags|=MCI_OPEN_TYPE;
//タイプ名記入
mop.lpstrDeviceType=type;
//MCIのオープンエレメント設定
dwFlags|=MCI_OPEN_ELEMENT;
//ファイル先記入
mop.lpstrElementName=file;
//MCIのウェイト設定
dwFlags|=MCI_WAIT;
//MCIコマンド
MCIERROR ret=mciSendCommand(NULL,MCI_OPEN,dwFlags,(DWORD)&mop);
//エラー確認
//if
if(ret==0){//もしエラー無ければ
//return
return true;
//if
}else{//もしエラー有れば
//エラー内容取得
mciGetErrorString(ret,buf,sizeof(buf));
//エラー内容をメッセージボックスに表示
MessageBox::Show(gcnew String(buf),"error");
//return
return false;
}//if終了
}//setPlayerメソッド終了
//findTypeメソッド
private: System::String^ findType(int x){
//int
int mType;
//文字列
String^ sType;
//for
for(int i=0;i<iType->Length;i++){
//if
if(files[x]->Substring(files[x]->Length-4)->ToLower()==iType[i]){//ファイル拡張子見つけた場合
//int
mType=i;//i数字をmTypeにコピー
}//if終了
}//for終了
//if
if(mType<45){
//文字列
sType="MPEGVideo";//MPEGVideoをsTypeに入れる
//if
}else if(mType==45){
//文字列
sType="avivideo";//avivideoをsTypeに入れる
//if
}else if(mType==46){
//文字列
sType="CDAudio";//CDAudioをsTypeに入れる
//if
}else if(mType==47){
//文字列
sType="WaveAudio";//WaveAudioをsTypeに入れる
//if
}else{
//文字列
sType="Sequencer";//SequencerをsTypeに入れる
}//if終了
return sType;
}//findTypeメソッド終了
どうか、このMP3再生できない謎を解いてください
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 16:11
by softya(ソフト屋)
動いている保証のあるプログラムをコピペして試してみてください。
自分のプログラムの問題なのかシステムの問題なのか切り分けてみましょう。
下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35
これで鳴らなければWindowsのシステムに問題があるか、再生しようとしているmp3のファイルフォーマットが特殊で再生できないかのどちらかです。
つまり、プログラムが悪くない可能性が高いと言うことです。
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 18:45
by ISLe
『mci mp3』でググったらMP3を再生するにはレジストリをいじる必要がある場合がある旨が書かれた記事が見付かります。
エラー出てないっておっしゃっているので違うかもしれませんが。
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 22:52
by 神族
softya(ソフト屋) さんが書きました:動いている保証のあるプログラムをコピペして試してみてください。
自分のプログラムの問題なのかシステムの問題なのか切り分けてみましょう。
下記のサイトのプログラムでwavの部分のコメントアウトして試してみてください。
「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」
http://etu.bituse.info/winapi/35
これで鳴らなければWindowsのシステムに問題があるか、再生しようとしているmp3のファイルフォーマットが特殊で再生できないかのどちらかです。
つまり、プログラムが悪くない可能性が高いと言うことです。
一応MIDIは再生できて後試しにメッセージボックスで拡張子認識など試して問題ないけど問題はMCIが何故かMP3再生できていないという・・・
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 22:59
by softya(ソフト屋)
動かないのは分かりました。
ただ、何を試して動かないのか説明になっていないので、どう試したかを書いてください。
下記のことは試されたのでしょうか?
ISLeさんの言われた通りMCI全般的にmp3を受けつかないのならレジストリをいじる必要があるのかも知れません。
Re: MCIコマンド助けて!
Posted: 2012年12月15日(土) 23:33
by 神族
softya(ソフト屋) さんが書きました:動かないのは分かりました。
ただ、何を試して動かないのか説明になっていないので、どう試したかを書いてください。
下記のことは試されたのでしょうか?
ISLeさんの言われた通りMCI全般的にmp3を受けつかないのならレジストリをいじる必要があるのかも知れません。
一応人柱してくれた人に聞いたらMIDIとWAV再生はできたけどMP3は、できなかったらしい。
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 00:55
by softya(ソフト屋)
私のところでは「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」のコードは動いています。
私の所はWindows7 64bitです。
神族さんの所では試していないということでしょうか?
あとレジストリは試されたり確認したりされましたか?
それぞれ、yes/noと理由・状況を教えて下さい。
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 01:08
by 神族
softya(ソフト屋) さんが書きました:私のところでは「MCIコマンドによる音声ファイル再生 | WINPAI入門サイト~ETU~」のコードは動いています。
私の所はWindows7 64bitです。
神族さんの所では試していないということでしょうか?
あとレジストリは試されたり確認したりされましたか?
それぞれ、yes/noと理由・状況を教えて下さい。
俺も試したところMIDIとWAVも再生できました。ただしMP3は駄目だった
他の拡張子はまだ
そしてレジストリ見たところ問題無かったです(ちゃんとMP3もMPEGVideoになってる)
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 01:29
by softya(ソフト屋)
それじゃ、前に書いてますが(1)mp3はいろんなフォーマットを試しましたか?(2) それと試したmp3はWindowsMediaPlayerでは再生できますか?
これも、それぞれお答えください。 あと、Windowsのバージョンも教えて下さい。
mp3は標準的な、44.1kか 48kHz STEREO のMPEG-1 Audio Layer-3で bpsは128k, 160k, 192k あたりが良いでしょう。
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 01:38
by 神族
softya(ソフト屋) さんが書きました:それじゃ、前に書いてますが(1)mp3はいろんなフォーマットを試しましたか?(2) それと試したmp3はWindowsMediaPlayerでは再生できますか?
これも、それぞれお答えください。 あと、Windowsのバージョンも教えて下さい。
mp3は標準的な、44.1kか 48kHz STEREO のMPEG-1 Audio Layer-3で bpsは128k, 160k, 192k あたりが良いでしょう。
WindowsMediaPlayerは、ちゃんとMP3再生できてます
一応標準的なMP3でもWindowsMediaPlayerは再生できましたけどMCIには何故かできない
WindowsバージョンはWindows 7 Ultimate 64Bit Service Pack 1です
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 01:57
by softya(ソフト屋)
明日、テストツールを作ってみます。
良かったら、著作権的に問題ない再生できないmp3をダウンロードできるように準備しておいてください。
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 02:10
by 神族
softya(ソフト屋) さんが書きました:明日、テストツールを作ってみます。
良かったら、著作権的に問題ない再生できないmp3をダウンロードできるように準備しておいてください。
お願いします!!(^_^)wktk中
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 12:12
by softya(ソフト屋)
再生テストのプログラムです。動作確認済みで、ウィンドウで右クリックするとファイル入力ダイアログが開くのでmp3ファイルを選んでください。
これでmp3ファイルが再生できなかったら、そのmp3を掲示板か何処かのアップローダにアップしてください。
ソースコードはかなり適当です。
コード:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define MSG(m) {\
MessageBoxA(NULL,m,NULL,MB_OK);}
//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;
//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300
LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {
static MCI_OPEN_PARMS open2;
static MCI_PLAY_PARMS play2;
static OPENFILENAME ofn = {0};
static TCHAR strFile[MAX_PATH] , strCustom[256] = TEXT( "Before files\0*.*\0\0" );
int result;
char buf[1000];
switch( msg ) {
case WM_DESTROY:
mciSendCommand( open2.wDeviceID, MCI_CLOSE, 0, 0 );
PostQuitMessage( 0 );
return 0;
case WM_CREATE:
ofn.lStructSize = sizeof ( OPENFILENAME );
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = TEXT( "mp3 files {*.mp3}\0*.mp3\0" )
TEXT( "All files {*.*}\0*.*\0\0" );
ofn.lpstrCustomFilter = strCustom;
ofn.nMaxCustFilter = 256;
ofn.nFilterIndex = 0;
ofn.lpstrFile = strFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
return 0;
case WM_RBUTTONUP:
GetOpenFileName( &ofn );
SetWindowText( hwnd , strFile );
//mp3再生の場合
open2.lpstrDeviceType = "MPEGVideo";
open2.lpstrElementName = strFile;
result = mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
( DWORD_PTR )&open2 );
//エラーなら0以外が返る
if( result ) {
//エラー取得
mciGetErrorString( result, buf, sizeof( buf ) );
MSG( buf );
PostQuitMessage( 0 );
return -1;
}
play2.dwCallback = ( DWORD )hwnd;
result = mciSendCommand( open2.wDeviceID, MCI_PLAY, MCI_NOTIFY, ( DWORD_PTR )&play2 );
//エラーなら0以外が返る
if( result ) {
//エラー取得
mciGetErrorString( result, buf, sizeof( buf ) );
MSG( buf );
PostQuitMessage( 0 );
return -1;
}
return 0;
case MM_MCINOTIFY:
if( lp == open2.wDeviceID ) {
if( wp == MCI_NOTIFY_SUCCESSFUL ) {
MSG( "再生完了" );
//シークバーを先頭に戻す
mciSendCommand( open2.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
}
return 0;
}
}
return DefWindowProc( hwnd, msg, wp, lp );
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = wc.hIcon = NULL;
wc.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
wc.lpszClassName = "test";
wc.lpszMenuName = NULL;
if( !RegisterClass( &wc ) ) {
MSG( "クラスの登録失敗" );
return -1;
}
//インスタンスハンドル
hinst = hInstance;
hwnd = CreateWindowA( "test", "テストウィンドウ", WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
0, 0, 400, 400, NULL, NULL, hInstance, NULL );
if( hwnd == NULL ) {
MSG( "ウィンドウ作成失敗" );
return -1;
}
//エラーチェック用変数
int check;
while( check = GetMessage( &msg, NULL, 0, 0 ) ) {
if( check == -1 ) {
break;
}
DispatchMessage( &msg );
}
//クラス解放
UnregisterClass( "test", hinst );
return 0;
}
Re: MCIコマンド助けて!
Posted: 2012年12月16日(日) 21:18
by 神族
softya(ソフト屋) さんが書きました:再生テストのプログラムです。動作確認済みで、ウィンドウで右クリックするとファイル入力ダイアログが開くのでmp3ファイルを選んでください。
mciplay.zip
これでmp3ファイルが再生できなかったら、そのmp3を掲示板か何処かのアップローダにアップしてください。
ソースコードはかなり適当です。
コード:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define MSG(m) {\
MessageBoxA(NULL,m,NULL,MB_OK);}
//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;
//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300
LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) {
static MCI_OPEN_PARMS open2;
static MCI_PLAY_PARMS play2;
static OPENFILENAME ofn = {0};
static TCHAR strFile[MAX_PATH] , strCustom[256] = TEXT( "Before files\0*.*\0\0" );
int result;
char buf[1000];
switch( msg ) {
case WM_DESTROY:
mciSendCommand( open2.wDeviceID, MCI_CLOSE, 0, 0 );
PostQuitMessage( 0 );
return 0;
case WM_CREATE:
ofn.lStructSize = sizeof ( OPENFILENAME );
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = TEXT( "mp3 files {*.mp3}\0*.mp3\0" )
TEXT( "All files {*.*}\0*.*\0\0" );
ofn.lpstrCustomFilter = strCustom;
ofn.nMaxCustFilter = 256;
ofn.nFilterIndex = 0;
ofn.lpstrFile = strFile;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_FILEMUSTEXIST;
return 0;
case WM_RBUTTONUP:
GetOpenFileName( &ofn );
SetWindowText( hwnd , strFile );
//mp3再生の場合
open2.lpstrDeviceType = "MPEGVideo";
open2.lpstrElementName = strFile;
result = mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
( DWORD_PTR )&open2 );
//エラーなら0以外が返る
if( result ) {
//エラー取得
mciGetErrorString( result, buf, sizeof( buf ) );
MSG( buf );
PostQuitMessage( 0 );
return -1;
}
play2.dwCallback = ( DWORD )hwnd;
result = mciSendCommand( open2.wDeviceID, MCI_PLAY, MCI_NOTIFY, ( DWORD_PTR )&play2 );
//エラーなら0以外が返る
if( result ) {
//エラー取得
mciGetErrorString( result, buf, sizeof( buf ) );
MSG( buf );
PostQuitMessage( 0 );
return -1;
}
return 0;
case MM_MCINOTIFY:
if( lp == open2.wDeviceID ) {
if( wp == MCI_NOTIFY_SUCCESSFUL ) {
MSG( "再生完了" );
//シークバーを先頭に戻す
mciSendCommand( open2.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
}
return 0;
}
}
return DefWindowProc( hwnd, msg, wp, lp );
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ) {
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WinProc;
wc.cbClsExtra = wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hCursor = wc.hIcon = NULL;
wc.hbrBackground = ( HBRUSH )GetStockObject( BLACK_BRUSH );
wc.lpszClassName = "test";
wc.lpszMenuName = NULL;
if( !RegisterClass( &wc ) ) {
MSG( "クラスの登録失敗" );
return -1;
}
//インスタンスハンドル
hinst = hInstance;
hwnd = CreateWindowA( "test", "テストウィンドウ", WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
0, 0, 400, 400, NULL, NULL, hInstance, NULL );
if( hwnd == NULL ) {
MSG( "ウィンドウ作成失敗" );
return -1;
}
//エラーチェック用変数
int check;
while( check = GetMessage( &msg, NULL, 0, 0 ) ) {
if( check == -1 ) {
break;
}
DispatchMessage( &msg );
}
//クラス解放
UnregisterClass( "test", hinst );
return 0;
}
おおお再生できているだとお!じゃーこのソースをよく読んで参考にしてみるわwまた何か問題起きたらまた質問しますねwありがとう!