/*	
 *	SofdecHelper.h
 *
 *	Sofdecヘルパー関数
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016-2017 Naoyuki Sawa
 *
 *	* Fri Apr 01 21:48:44 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	- 使用したコンパイラとライブラリは、以下の通りです。
 *	  │Microsoft Visual Studio Community 2015 Version 14.0.25123.00 Update 2
 *	  │CRI ADX2 SDK 2.08a (cri_adx2_sdk_pc_v2_08a_j.zip)
 *	  │CRI Sofdec2 SDK 2.08 (cri_sofdec2_pc_v2_08_j.zip)
 *	* Sat Apr 02 15:05:45 JST 2016 Naoyuki Sawa
 *	- 同時再生するムービーの数を、固定ではなく、SofdecHelper_Init()の引数で指定出来るように変更しました。
 *	- プレイヤーid=(管理用構造体のインデクス+1)としました。
 *	  アプリケーションの観点から、プレイヤーidには0を使わない方が使い易いと思ったからです。
 *	- SofdecHelper_Play()を、SofdecHelper_Load()とSofdecHelper_Play()に分離しました。
 *	  SofdecHelper_Stop()を、SofdecHelper_Stop()とSofdecHelper_Free()に分離しました。
 *	  この変更により、一回のSofdecHelper_Load()〜SofdecHelper_Free()の間に、複数回のSofdecHelper_Play()〜SofdecHelper_Stop()を実行出来るようになりました。
 *	* Mon Apr 04 21:27:10 JST 2016 Naoyuki Sawa
 *	- プロジェクトのプロパティを変更しました。
 *	  │【変更前】
 *	  │・構成=Debug  ,プラットフォーム=すべてのプラットフォーム:[C/C++]⇒[ランタイムライブラリ]⇒マルチスレッドデバッグDLL(/MDd)
 *	  │・構成=Release,プラットフォーム=すべてのプラットフォーム:[C/C++]⇒[ランタイムライブラリ]⇒マルチスレッドDLL(/MT)
 *	  │【変更後】
 *	  │・構成=Debug  ,プラットフォーム=すべてのプラットフォーム:[C/C++]⇒[ランタイムライブラリ]⇒マルチスレッドデバッグ(/MTd)
 *	  │・構成=Release,プラットフォーム=すべてのプラットフォーム:[C/C++]⇒[ランタイムライブラリ]⇒マルチスレッド(/MTd)
 *	  変更した理由は、以下の通りです。
 *	- 前回までは、SofdecHelper.dllを使うプログラムを実行しようとした時に、「vcruntime140.dllが無い」というエラーが出る事が有りました。
 *	  SofdecHelper.dllを、VC++2015のDLL版Cランタイム(vcruntime140.dll)を使う設定で、ビルドしてしまっていたからです。
 *	  手作業で、VC++2015の再配布可能ランタイムライブラリがインストールしないと、上記のエラーが解決出来ない問題が有りました。
 *	  これまでexeをビルドする時はVC++のDLL版Cランタイムでなくスタティックリンクするように気を付けていたのですが、dllのビルドはあまりしなかったので今回うっかり忘れていました。
 *	- 変更後は、vcruntime140.dllに依存しなくなったので、vcruntime140.dllがインストールされていない環境でも、エラーは出なくなりました。
 *	  ちなみに、SofdecHelper.dllがvcruntime140.dllに依存しているかどうかは、以下のコマンドで確認出来ます。
 *	  │vcvars32.bat				VC++6.0のbinにパスを通す。
 *	  │dumpbin.exe /DEPENDENTS SofdecHelper.dll	依存しているdllファイル名だけ確認する場合はこちら。
 *	  │,又は,
 *	  │dumpbin.exe /IMPORTS SofdecHelper.dll	依存しているdllファイル名とインポートしている関数も確認する場合はこちら。
 *	- SofdecHelper_Load()が呼び出す関数を、criManaPlayer_Prepare()⇒criManaPlayer_DecodeHeader()に変更しました。
 *	  変更した理由は、SofdecHelper_Load()内のコメントを参照して下さい。
 *	* Wed Apr 06 21:47:40 JST 2016 Naoyuki Sawa
 *	- ムービーファイルをパッキングファイルに含められるようにしました。
 *	  又は、これまで通り、ムービーファイルをパッキングファイルに含めない事も可能です。
 *	  さらに、パッキングファイルに含めたムービーファイルと、含めないムービーファイルを、併用する事も可能です。(マルチバンイド)
 *	- パッキングファイルのファイル名は、'default.cpk'固定です。
 *	  詳細は、SofdecHelper_Init()内のコメントを参照して下さい。
 *	- user_error_callback_func()が呼び出された時の処理を変えました。
 *	  【変更前】デバッグビルドでも、リリースビルドでも、die()で終了していた。
 *	  【変更後】デバッグビルドでは、これまで通りdie()で終了する。リリースビルドでは、メッセージボックスを表示して終了する。
 *	  変更した理由は、まだSofdec2の挙動を十分に理解出来ていないので、リリースビルドのDLLを使用中にエラーが発生する可能性も高いからです。
 *	  リリースビルドのDLLを使用中にエラーが発生した時も、なるべくエラー情報が得られるように、メッセージボックスを表示するようにしました。
 *	* Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
 *	- カレントフォルダに'default.cpk'が有るかどうかを調べるために、stat()ではなくGetFileAttributes()を使うように変更しました。
 *	  変更した理由は、VC++2015のランタイムのバグのために、WinXpではstat()が常に-1を返すからです。
 *	  詳細は、下記の資料を参照して下さい。(下記の資料は_stat()について述べていますが、stat()でも同じです。
 *	  尚、2016/04/06現在のVC++2015 Update2でもまだ直っていませんでした。
 *	  □「Stack Overflow - Visual C++ 2015 express: _stat not working on Windows XP」
 *	  │(http://stackoverflow.com/questions/32452777/visual-c-2015-express-stat-not-working-on-windows-xp)
 *	  │As pointed out in the comments, it is a bug in the runtime.
 *	  │Right now (2015-09-09) the fix is not yet available in an update, but probably will be soon.
 *	  │A workaround is to use GetFileAttributesEx instead.
 *	* Thu Apr 07 21:58:31 JST 2016 Naoyuki Sawa
 *	- USE_ADXを定義有りに変更しました。
 *	  定義無しだと'CRI Serve,'スレッドの中でアクセス違反で落ちる事が有ったからです。
 *	  確かにサンプルプログラムは全てcriAtomEx_Initialize_WASAPI()を使用しており、criAtomEx_Initialize()を使用しているサンプルプログラムは有りません。
 *	  これが原因と確定した訳では有りませんが、定義有りにすると今のところ落ちないので、何か関連は有りそうです。
 *	  現在の所サウンドはDxLibで行うから、ADXは無効にしたいのですが仕方がありません。
 *	  まだサウンド付きムービーを使用していないので、もしDxLibのサウンド処理と衝突した時にどうなるか未検証です。(ADXはOnでCRIMANA_AUDIO_TRACK_OFFだけ設定すれば良いのかな?)
 *	- USE_ADXを定義有りに変更した事により、WindowsXpでは動作しなくなりました。	←←←←←←←←←←■■■■■注意■■■■■
 *	  USE_ADXを定義するとcriAtomEx_Initialize_WASAPI()を呼び出し、criAtomEx_Initialize_WASAPI()はDirectX11に依存しているので、DirectX9までしかインストール出来ないWindowsXpでは初期化エラーになるからです。
 *	  USE_ADXを定義しなければcriAtomEx_Initialize()を呼び出し、criAtomEx_Initialize()はDirectXに依存していないのでWindowsXpでも動作するのですが、criAtomEx_Initialize()には上記の問題があるため、USE_ADXを定義してcriAtomEx_Initialize_WASAPI()を使わざるを得ません。
 *	* Fri Apr 15 23:25:13 JST 2016 Naoyuki Sawa
 *	- エラー停止時に表示するMessageBox()のタイプを、MB_SYSTEMMODAL⇒MB_TASKMODALに変更しました。
 *	  MB_SYSTEMMODALではなくMB_TASKMODALが適切です。
 *	  名前とは裏腹にアプリケーションのスレッドに属する全てのウインドウにフォーカスを移せなくするのはMB_SYSTEMMODALではなくMB_TASKMODALの方です。
 *	* Wed May 04 21:28:21 JST 2016 Naoyuki Sawa
 *	- AdxHelper関数群を追加しました。
 *	  一応基本的な動作確認は行いましたが、まだ十分に検証出来ていません。	⇒{{2016/05/16追記:しばらく使ってこれまでの所問題無く動作しています。}}
 *	* Mon May 16 21:56:02 JST 2016 Naoyuki Sawa
 *	- カレントフォルダに有る全ての'*.cpk'(有れば)にバインドするように変更しました。
 *	  これまではカレントフォルダに有る'default.cpk'(有れば)だけにバインドしていました。
 *	  変更後も'default.cpk'は自動的にバインド対象になりますので、既存のアプリケーションに対する互換性の問題は生じません。
 *	* Thu May 19 22:52:12 JST 2016 Naoyuki Sawa
 *	- 警告は無視するようにしました。
 *	  詳細は、user_error_callback_func()内のコメントを参照して下さい。
 *	- SofdecHelper_Init()のサウンドの初期化処理の箇所に、CriAtomExDbasConfigを明示的な指定についてコメントを追記しました。
 *	  要検討であり、まだコードは変更していません。
 *	* Thu Jul 28 21:15:13 JST 2016 Naoyuki Sawa
 *	- ライブラリをバージョンアップした事に伴い、当モジュールもリビルドしました。
 *	  当モジュールのソースコードには変更有りません。
 *	- 使用したコンパイラとライブラリは、以下の通りです。
 *	  │Microsoft Visual Studio Community 2015 Version 14.0.25123.00 Update 2	←前回と同じ
 *	  │CRI ADX2 SDK 2.09 (cri_adx2_sdk_pc_v2_09_j.zip)				←バージョンアップ
 *	  │CRI Sofdec2 SDK 2.09 (cri_sofdec2_pc_v2_09_j.zip)				←バージョンアップ
 *	* Sat Jul 30 20:01:40 JST 2016 Naoyuki Sawa
 *	- SofdecHelper_CopyFrameYUV()を呼び出すアプリケーションが、アルファ付きムービーであるかアルファ無しムービーであるかを意識しないで済むようにしました。
 *	  詳細は、SofdecHelper_CopyFrameYUV()関数内の、同日のコメントを参照して下さい。
 *	- SofdecHelper_GetAlpha()を追加しました。
 *	  本日、SofdecHelper_CopyFrameYUV()を呼び出すアプリケーションが、アルファ付きムービーであるかアルファ無しムービーであるかを意識しないで済むようにしましたが、
 *	  アルファ無しムービーの場合はa_imagebuf引数にNULLポインタを指定する方がSofdecHelper_CopyFrameYUV()のフィル処理が省けて高速になるので、
 *	  アプリケーションがアルファ付きムービーであるかアルファ無しムービーであるかを区別出来るように、SofdecHelper_GetAlpha()を追加しました。
 *	* Sat Jul 30 21:25:46 JST 2016 Naoyuki Sawa
 *	- SofdecHelper_GetFrameYUV()を追加しました。
 *	  用途はSofdecHelper_CopyFrameYUV()と同じで、どちらか一方を使用して下さい。
 *	  SofdecHelper_GetFrameYUV()の方が、メモリコピーが減るので、高速化が期待出来ます。
 *	- 当関数を追加したきっかけは、\cri\pc\include\cri_mana.hのCriManaFrameInfo構造体定義を見ていた時に、image_info[4]フィールドを直接参照出来る事に気付いたからです。
 *	  Sofdec2のAPI「criManaPlayer_DiscardFrame()」は、上記のフィールドをそのままコピーしているだけではないかと思います。
 *	  そうだとすると、上記のフィールドを直接参照する方が、メモリコピーが減って、高速化が期待出来ると思いました。
 *	  ただし、そのような使い方をして良いかどうかがマニュアルに載っていないので、もしかすると今後のライブラリバージョンアップ時に、問題が生じる恐れは有ります。
 *	- SofdecHelper_GetFrameYUV()は、上記のフィールドを直接返すのではなく、アプリケーション定義のコールバック関数を呼び出すようにしました。
 *	  そうした理由は、参照終了後にフレームを解放(criManaPlayer_DiscardFrame())する必要が有るからです。
 *	  明示的にフレームを開放する関数を追加する方法も有りますが、そうすると既存のSofdecHelper_CopyFrame()やSofdecHelper_CopyFrameYUV()と使い方が変わってしまうので、
 *	  同じ使い方を維持するために、アプリケーション定義のコールバック関数を呼び出すようにしました。
 *	  アプリケーション定義のコールバック関数が処理を返した後に、SofdecHelper_GetFrameYUV()が自動的にフレームを解放します。
 *	* Mon Aug 01 21:12:56 JST 2016 Naoyuki Sawa
 *	- Sofdec2ムービー,及び,ADX2サウンドのシームレス連続再生に対応しました。
 *	  この変更に伴い、SofdecHelper_Init()の引数仕様を変更しました。
 *	  シームレス連続再生を利用するアプリケーションは、ST_SofdecHelperInfo構造体のfnGetNextMovie,及び,fnGetNextSoundに関数ポインタを指定して、SofdecHelper_Init()を呼び出して下さい。
 *	  詳細は、ST_SofdecHelperInfo構造体定義箇所のコメントを参照して下さい。
 *	* Tue Sep 06 21:06:46 JST 2016 Naoyuki Sawa
 *	- これまでの32ビット版に加えて、64ビット版のDLLもビルド出来るようにしたので、64ビット版では'SofdecHelper_x64.lib'をリンクするように、条件コンパイルを追加しました。
 *	* Sat Sep 17 21:14:33 JST 2016 Naoyuki Sawa
 *	- SofdecHelperのアルゴリズムも、AdxHelperのアルゴリズムと同様に、最初にプレイヤーを全て作成しておいて最後まで使い回すように変更しました。
 *	  これまでは、SofdecHelperのアルゴリズムは、AdxHelperのアルゴリズムと違って、再生の都度、プレイヤーの作成と削除を繰り返していましたが、今後は上記の通り、AdxHelperのアルゴリズムと同様になります。
 *	  このように変更した理由の一つは、プレイヤーの作成と削除のオーバーヘッド低減のためであり、アプリケーションから意識する必要は有りません。
 *	  もう一つの理由は、再生開始時の遅延を低減するために、ムービーの再生準備を対応したいからです。(←この対応はまだ行っていません。まずは準備として上記の変更を行いました。)	⇒{{2016/09/17コメント追記:ムービーの再生準備を対応しました。}}
 *	* Sat Sep 17 21:29:14 JST 2016 Naoyuki Sawa
 *	- ムービーの再生準備を対応しました。
 *	  当モジュールの処理の変更点は多かったのですが、アプリケーションの観点からの変更点は以下の二点のみです。
 *	  ・近い将来に再生する可能性が高いムービーを、SofdecHelper_Prepare()を呼び出して再生準備しておき、再生開始時の遅延を低減する事が出来ます。
 *	    空きエントリが無ければ再生準備は行われませんし、その後に別の再生準備が多く行われると古い再生準備はキャンセルされるので、必ずしも効果が有るとは限らず、実際に再生準備されているかどうかをアプリケーションから確認する方法は有りません。(一般的なキャッシュと同様です)
 *	  ・SofdecHelper_Free()で停止したムービーは、すぐに、次回の再生に備えて暗黙的に再生準備が行われます。(一般的なLRUと同様の動作です。最近停止したムービーはまたすぐに再生される可能性が高いという想定に基づきます。)
 *	    この動作については、アプリケーションが明示的にSofdecHelper_Prepare()を呼び出す必要は無く、自動的に行われます。
 *	    実際に再生開始まで再生準備が維持されているかどうかは、その後の動作次第であり、実際に再生準備されているかどうかをアプリケーションから確認する方法は有りません。(一般的なキャッシュと同様です)
 *	    尚、この動作はUSE_FREE_PREPシンボルを定義した場合のみ有効となります。2016/09/17現在はUSE_FREE_PREPシンボルを定義して、この動作を有効としてあります。
 *	* Sun Sep 18 21:28:04 JST 2016 Naoyuki Sawa
 *	- サウンドの再生準備を対応しました。
 *	  具体的には、以下の通りです。
 *	- ムービーと違って、サウンドはアプリケーション側で再生開始までブロックしないので、遅延がさほど目立たないのですが、実際に測ってみると、サウンドも50〜100ミリ秒ぐらい再生開始時の遅延が有るようでした。
 *	  50〜100ミリ秒も遅延が有ると、やはり、ループの繋がり等が不自然なのが聞いて判ってしまいます。
 *	  そこで、昨日のムービーの再生準備と同様に、サウンドも再生準備を対応する事にしました。
 *	- ムービーの再生準備のアルゴリズムと、サウンドの再生準備のアルゴリズムは、少し異なるものとなりました。
 *	  なぜならば、ムービーの再生チャネルは当モジュールが割り当ててアプリケーションに返すのに対し、サウンドの再生チャネルはアプリケーション側から指定する仕組みになっているからです。(そう決めたのは自分ですが…)
 *	  ムービーでは、再生チャネルがそのまま再生準備のプールとして使えたのですが、サウンドでは、プールを表す新たな構造体(ST_AtomExPlayerPool)を設けました。
 *	* Sun Sep 18 22:15:08 JST 2016 Naoyuki Sawa
 *	- サウンドの同時再生数が多い時に「E09022032B:Increase max_streams of CriAtomDbasConfig.」が出ていた問題を修正しました。
 *	  2016/09/18現時点ではまだ、AdxHelper_GetTotalTime()が消費する分を考慮出来ていないという問題が残っています。詳細はSofdecHelper_Init()内のコメントを参照して下さい。	(※TODO:2016/09/18)
 *	- サウンドの同時再生数が多い時に「W2010030305:Can not allocate playback info. (Increase max_virtual_voices of CriAtomExConfig.)」が出ていた問題を修正しました。
 *	  2016/09/18現時点ではまだ、AdxHelper_GetTotalTime()が消費する分を考慮出来ていないという問題が残っています。詳細はSofdecHelper_Init()内のコメントを参照して下さい。	(※TODO:2016/09/18)
 *	* Sun Sep 18 22:20:10 JST 2016 Naoyuki Sawa
 *	- SofdecHelper_Stop()を廃止しました。
 *	  既に、2016/08/01にシームレス連続再生に対応するための変更を行った時点で、SofdecHelper_Stop()は使えなくなっていました。
 *	  また、2016/09/17にムービーの再生準備に対応するための変更を行った時点で、SofdecHelper_Stop()が再び使える見込みは無くなりました。
 *	  SofdecHelper_Stop()は一度セットしたデータを何度も使い回して再生する目的で用意したのですが、上記二点の変更によって一度セットしたデータを何度も使い回して再生する事は出来なくなっているからです。
 *	  SofdecHelper_Stop()を廃止した事による、アプリケーションへの影響は有りません。
 *	  便利かなと思ってSofdecHelper_Stop()を追加していたものの、実際には/clip/DxlibHelper.cppからもアプリケーションから直接にも、一度も使用していなかったからです。
 *	* Sun Sep 18 25:18:38 JST 2016 Naoyuki Sawa
 *	- AdxHelper_Stop()が呼び出されなくても、再生が終了したら自動的に次回の再生準備を行うようにしました。
 *	  具体的には、以下の通りです。
 *	- これまでは、例えば5秒のサウンドを、10秒毎に再生する場合、5秒経過時点では次回の再生準備が行われず、10秒時点でAdxHelper_Play()経由で呼び出されるAdxHelper_Stop()で再生準備が行われ、このケースでは、再生準備による遅延回避が有効に働いていませんでした。
 *	  実際には、2016/09/18現在の/clip/DxlibHelper.cppでは、サウンドの再生時間のタイミングに合わせてfnEndハンドラがAdxHelper_Stop()を呼び出すので、5秒時点でAdxHelper_Stop()が呼び出されて次回の再生準備が行われるのですが、DxlibHelper.cppの実装に依存してたまたま遅延回避出来ていただけで、当モジュールの動作としては望ましくないものでした。
 *	  そこで改善策として、サウンドが再生終了(=CRIATOMEXPLAYER_STATUS_PLAYEND)しているかを監視し、再生終了していたら自動的に次回の再生準備を行うようにしました。(明示的にAdxHelper_Stop()が呼び出されなくても)
 *	  こうする事で、例えば5秒のサウンドを、10秒毎に再生する場合、明示的なAdxHelper_Stop()が呼び出されなくても、5秒時点で次回の再生準備が行われ、10秒時点の再生での再生遅延が回避出来ます。
 *	- 尚、上記のアルゴリズムは、サウンドに対してのみ適用可能なアルゴリズムであり、ムービーに対して同様の変更を行ってはいけない事に注意して下さい。	←←←←←←←←←←←←←←←←←←←←■■■■■■重要■■■■■
 *	  サウンドは再生チャネルの状態がアプリケーションから不可視であり、再生チャネルが自動的に終了して、使用している再生プールが勝手に開放されて次回の再生準備状態へ移行しても問題無いから、適用出来るアルゴリズムです。
 *	  ムービーの場合は、エントリの状態がアプリケーションから可視であり、ムービーが最後まで到達しても、そのエントリは引き続きアプリケーションからのSofdecHelper_CopyFrame()やSofdecHelper_CopyFrameYUV()に応答しなければいけないので、勝手に終了する事は出来ません。
 *	* Mon Sep 19 21:47:11 JST 2016 Naoyuki Sawa
 *	- AdxHelper_GetTotalTime()を高速化しました。
 *	- これまでは、再生処理とは関係無く一時的なプレーヤを作成して、新たにサウンドをロードしてサウンドの情報を取得していました。
 *	  cliptaps.cは、再生開始時に再生時間を取得し、DxlibHelper.cppでの再生時間のキャッシュにヒットしなければ、再生時間を取得するために60〜70ミリ秒ぐらいの時間がかかっており、再生遅延の問題が生じていました。
 *	  その上、再生時間を取得するために準備したサウンドは、実際の再生の準備としては使用せずに破棄してしまい、無駄が生じていました。
 *	- 今回の変更によって、再生中の再生プールや再生準備中の再生プールから再生時間が取得出来るならば、それらから再生時間を取得するようにして、AdxHelper_GetTotalTime()を高速化しました。
 *	  上記が失敗した場合は、これまで通り、新たにサウンドをロードしてサウンドの情報を取得するので遅延が生じるのですが、その場合でも、再生プールが開いているならばそのまま再生準備中の再生プールとして残すようにしました。
 *	  再生時間を取得した後にすぐ再生を開始する場合に、これまでは二倍の遅延が生じていたのが、一倍の遅延で済む可能性が高くなりました。(再生プールが開いていなかった場合はこれまで通り二倍の遅延が生じます。)
 *	- 詳細は、AdxHelper_GetTotalTime()のコメントを参照して下さい。
 *	* Mon Sep 19 22:17:04 JST 2016 Naoyuki Sawa
 *	- SofdecHelper_Prepare()が戻り値を返すように変更しました。
 *	  戻り値の仕様は、SofdecHelper_Prepare()のコメントを参照して下さい。
 *	- AdxHelper_Prepare()が戻り値を返すように変更しました。
 *	  戻り値の仕様は、AdxHelper_Prepare()のコメントを参照して下さい。
 *	* Wed Mar 22 22:14:37 JST 2017 Naoyuki Sawa
 *	- AdxHelper_GetFormatInfo()を追加しました。
 *	  これまでも最低限の情報はAdxHelper_GetTotalTime()で取得出来ていましたが、もっと多くの情報を取得するためにcriAtomExPlayback_GetFormatInfo()が返す情報を全て取得出来るようにしました。
 *	  AdxHelper_GetFormatInfo()を追加した事に伴い、既存のAdxHelper_GetTotalTime()がAdxHelper_GetFormatInfo()を呼び出すように実装を変更しました。
 *	  AdxHelper_GetTotalTime()の結果は変わらないので、既存のアプリケーションの修正は不要です。
 *	* Mon Apr 03 23:36:16 JST 2017 Naoyuki Sawa
 *	- 暗号化されたデータの再生や情報取得に対応しました。
 *	  ST_SofdecHelperInfo構造体のフィールドが増えたので、当dllを使用している既存のアプリケーションもリビルドが必要です。
 *	- データを暗号化した時のキーと、ST_SofdecHelperInfo構造体に指定した復号キーが一致しない場合、ムービーと音声とで、挙動が違う事に注意して下さい。
 *	  ・ムービーは、再生エラーになります。(参考資料:/cri/pc/include/cri_mana.h「（暗号化されていないムービデータや、暗号キーの異なるムービデータは全て再生エラーとなります。）」)
 *	    復号キーが合っていないと、情報を取得しようとしただけでもエラーになるので、/clip/tool/SofdecProbe/での復号キー指定対応は必須です。
 *	  ・音声は、エラーは発生せず、ノイズが再生されます。(参考資料:/cri/pc/include/cri_atom_ex.h「（暗号化されていない音声データや、暗号キーの異なる音声データは全てノイズとなります。）」)
 *	    復号キーが合っていなくても、情報は取得出来るようなので、/clip/tool/AdxProbe/の復号キー対応は必須では有りませんが、対応しておく方が良いと思うので対応する事にしました。
 *	- 暗号化の方法については、PC用のCRIのSDKよりも、Unity用のCRIのSDKの方が、判り易いと思います。
 *	  主に、「C:\criware_sdk_unity_smartphone_v2_88_j\cri\documentation\CRIWARE_Unity_Plugin_Manual_smartphone_j.chm」の、「データの暗号化」のページを参照して下さい。
 *	  上記のページには主に、GUIツールを使って暗号化する方法が書かれていますが、全てコマンドラインツールでも暗号化出来ます。
 *	  コマンドラインツールの説明ページのオプションも、合わせて参照して下さい。
 *	  音声データの暗号化は、criatomencd.exeの"-keycode="オプションです。
 *	  ムービーデータの暗号化は、sofdec2enc.exeは暗号化にかかわらず、独立した暗号化ツールであるusmbreak.exeで暗号化します。
 *	  Unityで再生する場合は、上記に加えて、GenerateAuthenticationFile.exeも使います。
 *	  尚、APIの仕様自体はムービーと音声にそれぞれ別の復号キーを指定して別々のデクリプタを作成出来ますが、Unityで再生する場合はCriWareLibraryInitializerの復号キーの指定が一つなので、両方のキーを同じにせざるを得ません。
 *	* Sun Apr 09 22:05:18 JST 2017 Naoyuki Sawa
 *	- コンパイラを、VS2015⇒VS2017に更新しました。
 *	  当モジュールのソースコードには変更有りません。
 *	- 使用したコンパイラとライブラリは、以下の通りです。
 *	  │Microsoft Visual Studio Community 2017 Version 15.1 (26403.0) Release	←バージョンアップ
 *	  │CRI ADX2 SDK 2.11 (cri_adx2_sdk_pc_v2_11_j.zip)				←前回と同じ
 *	  │CRI Sofdec2 SDK 2.10 (cri_sofdec2_pc_v2_10_j.zip)				←前回と同じ
 *	* Tue Apr 18 21:46:46 JST 2017 Naoyuki Sawa
 *	- Visual Studio 2017をバージョンアップした事に伴い、当モジュールもリビルドしました。
 *	  当モジュールのソースコードには変更有りません。
 *	- 使用したコンパイラとライブラリは、以下の通りです。
 *	  │Microsoft Visual Studio Community 2017 Version 15.1 (26403.7) Release	←バージョンアップ
 *	  │CRI ADX2 SDK 2.11 (cri_adx2_sdk_pc_v2_11_j.zip)				←前回と同じ
 *	  │CRI Sofdec2 SDK 2.10 (cri_sofdec2_pc_v2_10_j.zip)				←前回と同じ
 */
#ifndef __SOFDECHELPER_H__
#define __SOFDECHELPER_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	
 ****************************************************************************/
#ifdef  SOFDECHELPER_BUILD
  #define SOFDECHELPER_DLLAPI __declspec (dllexport)
#else //SOFDECHELPER_BUILD
  #define SOFDECHELPER_DLLAPI __declspec (dllimport)
//{{2016/09/06変更:これまでの32ビット版に加えて、64ビット版のDLLもビルド出来るようにしたので、64ビット版では'SofdecHelper_x64.lib'をリンクするように、条件コンパイルを追加しました。
//#pragma comment(lib, "SofdecHelper.lib")
//↓2016/09/06変更:これまでの32ビット版に加えて、64ビット版のDLLもビルド出来るようにしたので、64ビット版では'SofdecHelper_x64.lib'をリンクするように、条件コンパイルを追加しました。
#ifndef _WIN64
  #pragma comment(lib, "SofdecHelper.lib")	//32ビット版
#else //_WIN64
  #pragma comment(lib, "SofdecHelper_x64.lib")	//64ビット版
#endif//_WIN64
//}}2016/09/06変更:これまでの32ビット版に加えて、64ビット版のDLLもビルド出来るようにしたので、64ビット版では'SofdecHelper_x64.lib'をリンクするように、条件コンパイルを追加しました。
#endif//SOFDECHELPER_BUILD
/****************************************************************************
 *	SofdecHelper
 ****************************************************************************/
//{{2016/08/01変更:シームレス連続再生に対応しました。
//SOFDECHELPER_DLLAPI void SofdecHelper_Init(int _NumMovies_NumSounds);		//_NumMovies_NumSounds[0:15]=_NumMovies(0可),_NumMovies_NumSounds[31:16]=_NumSounds(0可)	ビットフィールドにした理由はAdxHelperを追加する前の既存のアプリケーションとの互換性のためです。既存のアプリケーションは_NumMovies_NumSounds[31:16]=0で当関数を呼び出しているはずなので_NumSounds=0を指定するのと同じ事になります。
//↓2016/08/01変更:シームレス連続再生に対応しました。
typedef struct _ST_SofdecHelperInfo {
	//--- SofdecHelper ---
	int			NumMovies;		//同時再生するムービーの数	0可
	void			(*fnGetNextMovie)(const char* sCurrentMoviePath, char sNextMoviePath[/*_MAX_PATH*/]);	//ムービーのシームレス連続再生用コールバック	NULL可		現在再生中のムービー(sCurrentMoviePath)の次のムービーが有る場合、sNextMoviePathにパス名を格納して下さい。次のムービーが無い場合は、何もせずに処理を返して下さい。
	unsigned __int64	MovieKey;		//暗号化されたムービーデータの復号キー		0を指定すると、ムービーデータは暗号化されていないものと見なして、ムービーデータのデクリプタを作成しない。	//{{2017/04/03追加:暗号化されたデータの再生や情報取得に対応しました。}}
	//--- AdxHelper ---
	int			NumSounds;		//同時再生するサウンドの数	0可
	void			(*fnGetNextSound)(const char* sCurrentSoundPath, char sNextSoundPath[/*_MAX_PATH*/]);	//サウンドのシームレス連続再生用コールバック	NULL可		現在再生中のムービー(sCurrentMoviePath)の次のムービーが有る場合、sNextMoviePathにパス名を格納して下さい。次のムービーが無い場合は、何もせずに処理を返して下さい。
	unsigned __int64	SoundKey;		//暗号化された音声データの復号キー		0を指定すると、音声データは暗号化されていないものと見なして、音声データのデクリプタを作成しない。		//{{2017/04/03追加:暗号化されたデータの再生や情報取得に対応しました。}}
} ST_SofdecHelperInfo;
SOFDECHELPER_DLLAPI void SofdecHelper_Init(const ST_SofdecHelperInfo* pInfo);
//}}2016/08/01変更:シームレス連続再生に対応しました。
SOFDECHELPER_DLLAPI void SofdecHelper_Exit();
SOFDECHELPER_DLLAPI void SofdecHelper_Exec();
SOFDECHELPER_DLLAPI int SofdecHelper_Prepare(const char* path);			//{{2016/09/17追加:ムービーの再生準備を対応しました。}}		//{{2016/09/19変更:SofdecHelper_Prepare()が戻り値を返すように変更しました。}}
SOFDECHELPER_DLLAPI int SofdecHelper_Load(const char* path);			//SofdecHelper_Load()は1〜NumMoviesの範囲の値を返します(0は返しません)。以下の関数のiManaPlayer引数にはSofdecHelper_Load()が返した値を指定して下さい。
SOFDECHELPER_DLLAPI void SofdecHelper_Play(int iManaPlayer, int loop);
//SOFDECHELPER_DLLAPI void SofdecHelper_Stop(int iManaPlayer);			//{{2016/09/18削除:SofdecHelper_Stop()を廃止しました。}}
SOFDECHELPER_DLLAPI void SofdecHelper_Free(int iManaPlayer);
SOFDECHELPER_DLLAPI int SofdecHelper_CopyFrame(int iManaPlayer, void* imagebuf, int bufsize, int pitch);
SOFDECHELPER_DLLAPI int SofdecHelper_CopyFrameYUV(int iManaPlayer, void* y_imagebuf, int y_bufsize, int y_pitch, void* u_imagebuf, int u_bufsize, int u_pitch, void* v_imagebuf, int v_bufsize, int v_pitch, void* a_imagebuf/*NULL可*/, int a_bufsize/*0可*/, int a_pitch/*0可*/);
SOFDECHELPER_DLLAPI int SofdecHelper_GetFrameYUV(int iManaPlayer, void (*fn)(void* y_imagebuf, int y_bufsize, int y_pitch, void* u_imagebuf, int u_bufsize, int u_pitch, void* v_imagebuf, int v_bufsize, int v_pitch, void* a_imagebuf, int a_bufsize, int a_pitch, void* user_data), void* user_data);
SOFDECHELPER_DLLAPI const char* SofdecHelper_GetStatus(int iManaPlayer);
SOFDECHELPER_DLLAPI int SofdecHelper_GetWidth(int iManaPlayer);			//ムービー最大幅(8の倍数)
SOFDECHELPER_DLLAPI int SofdecHelper_GetHeight(int iManaPlayer);		//ムービー最大高さ(8の倍数)
SOFDECHELPER_DLLAPI int SofdecHelper_GetDispWidth(int iManaPlayer);		//表示したい映像の横ピクセル数(左端から)
SOFDECHELPER_DLLAPI int SofdecHelper_GetDispHeight(int iManaPlayer);		//表示したい映像の縦ピクセル数(上端から)
SOFDECHELPER_DLLAPI int SofdecHelper_GetFramerate(int iManaPlayer);		//フレームレート[x1000]
SOFDECHELPER_DLLAPI int SofdecHelper_GetFramerateN(int iManaPlayer);		//有理数形式フレームレート(分子) framerate [x1000] = framerate_n / framerate_d
SOFDECHELPER_DLLAPI int SofdecHelper_GetFramerateD(int iManaPlayer);		//有理数形式フレームレート(分母) framerate [x1000] = framerate_n / framerate_d
SOFDECHELPER_DLLAPI int SofdecHelper_GetTotalFrames(int iManaPlayer);		//総フレーム数
SOFDECHELPER_DLLAPI int SofdecHelper_GetMaterialWidth(int iManaPlayer);		//エンコード前のビデオ素材の横ピクセル数
SOFDECHELPER_DLLAPI int SofdecHelper_GetMaterialHeight(int iManaPlayer);	//エンコード前のビデオ素材の縦ピクセル数
SOFDECHELPER_DLLAPI int SofdecHelper_GetAlpha(int iManaPlayer);			//アルファストリームの数(0,又は,1)
/****************************************************************************
 *	AdxHelper
 ****************************************************************************/
SOFDECHELPER_DLLAPI int AdxHelper_Prepare(const char* path);			//{{2016/09/18追加:サウンドの再生準備を対応しました。}}		//{{2016/09/19変更:AdxHelper_Prepare()が戻り値を返すように変更しました。}}
SOFDECHELPER_DLLAPI void AdxHelper_Play(int iAtomExPlayer, const char* path);	//iAtomExPlayer引数に指定出来る値の範囲は1〜NumSoundsです(0は不可です)。以下の関数も同様です。
SOFDECHELPER_DLLAPI void AdxHelper_Stop(int iAtomExPlayer);
SOFDECHELPER_DLLAPI void AdxHelper_SetVolume(int iAtomExPlayer, double volume);
SOFDECHELPER_DLLAPI void AdxHelper_SetPan(int iAtomExPlayer, double pan);
SOFDECHELPER_DLLAPI int AdxHelper_GetTotalTime(const char* path);
/*--------------------------------------------------------------------------*/
//{{2017/03/22追加:AdxHelper_GetFormatInfo()を追加しました。
typedef struct _ST_AdxHelper_FormatInfo {
	const char*	format;			//フォーマット種別
	int		sampling_rate;		//サンプリング周波数
	int		num_samples;		//総サンプル数
	int		loop_offset;		//ループ開始サンプル
	int		loop_length;		//ループ区間サンプル数
	int		num_channels;		//チャンネル数
} ST_AdxHelper_FormatInfo;
SOFDECHELPER_DLLAPI void AdxHelper_GetFormatInfo(const char* path, ST_AdxHelper_FormatInfo* pFormatInfo);
//}}2017/03/22追加:AdxHelper_GetFormatInfo()を追加しました。
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__SOFDECHELPER_H__
