RSS配信

ログインフォーム






パスワードを忘れました?
未登録ですか? 新規登録
Home arrow フォーラム

Tapur support forum

 
<< 最初 < 戻る 1 2 3 4 5 次へ > 最後 >>
gypsy
User

Senior Boarder
Posts: 19
graphgraph
Karma: 0  
Re:MP3録音ができません - 2009/06/30 23:00 ソースを見てないので確認のためお尋ねしますが、
以下のような単純な列挙コードで、
今回のような問題が出ているのでしょうか?
(元々は以下のような列挙コードだったのでしょうか?)


BOOL CALLBACK _acmFormatEnumCallback( HACMDRIVERID hadid, LPACMFORMATDETAILS pafd, DWORD dwInstance, DWORD fdwSupport )
{
//コーデック取得
return TRUE;
}

int main(void)
{
// :
//コーデックの列挙

MMRESULT mmr = acmFormatEnum( had, &fd, &_acmFormatEnumCallback, 0, 0 );
if ( mmr != 0 ) {
//列挙できない
return -1;
}

//処理継続
// :
}
  | | The administrator has disabled public write access.
yamamoto
Admin

Admin
Posts: 60
graph
Karma: 1  
Re:MP3録音ができません - 2009/07/02 03:59 こんにちわ。
ご試用ありがとうございます。

効果はあったようですが、残念ながら完全ではなかったようです。
可能な範囲で、リトライと待機時間を更に増やしてみようと思います。

テストにはecho123が使えますよ。
開発時もよく使っています。

通知領域のポップアップについては、他の方からも同様の要望があれば検討してみます。
  | | The administrator has disabled public write access.
yamamoto
Admin

Admin
Posts: 60
graph
Karma: 1  
Re:MP3録音ができません - 2009/07/02 04:59 こんにちわ。

まさに、そのように記述しています。
実際のコードは以下のような感じです。
pwfは16kHzのWAVEフォーマットです。

MMRESULT res;
ACMFORMATDETAILS formatDetails;
memset(&formatDetails, 0, sizeof(ACMFORMATDETAILS));
LPWAVEFORMATEX ptmp;
formatDetails.dwFormatTag = WAVE_FORMAT_MPEGLAYER3;
ptmp = (LPWAVEFORMATEX)new char[sizeof(MPEGLAYER3WAVEFORMAT)];
memset(ptmp, 0, sizeof(MPEGLAYER3WAVEFORMAT));
memcpy(ptmp, pwf, sizeof(WAVEFORMATEX));
formatDetails.pwfx = ptmp;
formatDetails.cbStruct = sizeof(ACMFORMATDETAILS);
formatDetails.fdwSupport = 0;
res = acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT, &formatDetails.cbwfx);
if (res) {
return 0;
}
res = acmFormatEnum(had, &formatDetails, (ACMFORMATENUMCB)acmFormatEnumCallback, (DWORD)(void*)this, ACM_FORMATENUMF_CONVERT);
if (res) {
return 0;
}
  | | The administrator has disabled public write access.
gypsy
User

Senior Boarder
Posts: 19
graphgraph
Karma: 0  
Re:MP3録音ができません - 2009/07/02 17:27 返答ありがとうございます。

提示していただいた例にはコールバック関数の実装が書かれていていないので
想像の域は出ないのですが、
MSDN の acmFormatEnum の仕様を見ると以下のように書かれているので
ひょっとしたらコールバック関数が FALSE を返しているようなシチュエーションがあるのではないかと思った次第です。

>指定されたフォーマットタグに利用可能なウェーブフォーム オーディオフォーマットを、ACM ドライバから列挙します。
>この関数は、適切なフォーマットタグがすべて列挙されるか、コールバック関数が FALSE を返すまで列挙を続けます。

仕様からは、コールバック関数が常に TRUE を返す限り
acmFormatEnum は列挙が終了するまで戻らない(WAITする)と思われるので、
タイムアウトやリトライなどの処理などは基本的に不要なのではないかと思いました。
  | | The administrator has disabled public write access.
yamamoto
Admin

Admin
Posts: 60
graph
Karma: 1  
Re:MP3録音ができません - 2009/07/04 16:09 コールバック関数は以下のような感じで、TRUE以外は返していません。
私も、タイムアウトやリトライは本来不要なはずと考えていますが、それで改善されているようなら、仕方ないと思っています。

BOOL CALLBACK acmFormatEnumCallback(HACMDRIVERID hdriverId, LPACMFORMATDETAILS lpFormatDetails, DWORD dwInstance, DWORD dwSupport)
{
CAcmMgr* pObj = (CAcmMgr*)dwInstance;
if (pObj->m_dicFormat->GetCount() > 0) {
LPWAVEFORMATEX pwf;
if (pObj->m_dicFormat->Lookup(lpFormatDetails->szFormat, pwf)) return TRUE; // フォーマット名の重複がある
}

// フォーマット文字列とWAVEFORMATEXのコレクション
LPWAVEFORMATEX pwf = new WAVEFORMATEX;
memcpy(pwf, lpFormatDetails->pwfx, sizeof(WAVEFORMATEX));
pObj->m_dicFormat->SetAt(lpFormatDetails->szFormat, pwf);

return TRUE;
}
  | | The administrator has disabled public write access.
gypsy
User

Senior Boarder
Posts: 19
graphgraph
Karma: 0  
Re:MP3録音ができません - 2009/07/13 16:42 こんにちは

Tapur の録音設定画面で問題の出るプライベートの PC 環境は
acmFormatEnum() が MMSYSERR_INVALFLAG を返すことがあり
フォーマットの列挙できないというのが現象の原因だったようです。
(それ以外のPC環境ではこのような挙動は確認できませんでした)

開示いただいたソースをもとにテストコードを書いて、
試行錯誤しているうちに安定した列挙ができるようになってしまったので
これが原因だという箇所を断定することはできないのですが、
一応 NG だったケースについて挙げておきます。

■ acmFormatEnum() の第一引数のNULLにすると MMSYSERR_INVALFLAG を返す

MSDN には
>このパラメータに NULL を指定すると、ACM は適切な ACM ドライバのうち最初のドライバの詳細を使います。
と書かれていますすが、問題の環境で第一引数を NULL にして acmFormatEnum() を呼び出すと
必ず MMSYSERR_INVALFLAG を返していました。
そのため、 acmDriverEnum() でまずドライバを列挙して、
それぞれのドライバについて acmDriverOpen() → acmFormatEnum() というように処理するようにしました。

■ acmMetrics() で取得したサイズの WAVEFORMATEX 構造体のバッファを確保して正しく初期化する

acmFormatEnum() には ACM_FORMATENUMF_CONVERT を指定して呼び出しますので、
ACMFORMATDETAILS 構造体の pwfx メンバに指定するバッファは変換元のフォーマットを指定します。
このバッファは同一内容なので、使いまわすようにしていると列挙が安定しないことがありました。
(実行するたびに列挙できなかったり、列挙できたりすることがある)
acmFormatEnum() 毎に正しく初期化する必要があるようです。

あと、WAVEFORMATEX 構造体の cbSize メンバは 0 でなければなりません。


メールでテストコードのソースをお送りしておりますので参考になれば幸いです。

手元の環境では20回ほど試行して問題がでませんでした。
テストコードを xere さんの環境でもテストしていただければよいのですが...
  | | The administrator has disabled public write access.
<< 最初 < 戻る 1 2 3 4 5 次へ > 最後 >>
track feed
© 2024 Tapur for Skype Japanese
Joomla! is Free Software released under the GNU/GPL License.
Translation is Joomla!JAPAN