MMSSTVサウンドカードエンジン 初版 2002.4.09 JE3HHT 森 誠 改訂 2002.6.28 JE3HHT 森 誠 ========== ◎はじめに ==========  私はサウンドカードを使ったSSTV通信用プログラム「MMSSTV」をリリースしました。実際このプログラムを使って多くの方とQSOをする楽しみも得ました。  しかし私自身がSSTVの初心者な事、更に私の時間と能力には限界があり、MMSSTV内に実装できない機能が未だ少なからず存在しています。また私達アマチュア無線家は伝統的に多様性や個性を重視してきました。 そこでいろいろなデザインのSSTVプログラムが更に数多く出現することを期待して、サウンドカードを利用したSSTVの送受信を処理する、SSTVエンジンをリリースすることにしました。  このエンジンはWindowsの32bitコードで記述されたDLLファイルで、32bitコードで記述されるアプリケーションプログラムから利用することができます。エンジン内のDSP部分のコードは、MMSSTV内に実装されているものとまったく同じです。 このエンジンを作成するにあたり、VBとのインターフェース方法などの重要な部分において、Moe(AE4JY)さんのPSKCore.dllを参考にしました。素晴らしいPSKエンジンをリリースしている彼に感謝の意を述べたいと思います。 また児島(JE4IVN)さんとErik(VK4AES)さんには、このエンジンのデバッグでお付き合い頂き、またVBから使用する上での不備などを指摘頂きました。恐らく彼らがいなければ、このエンジンは完成しなかったと思います。有難うございました。 ================ ◎配布パッケージ ================  SSTVエンジンの配布パッケージは以下のファイルで構成されます。 SSTVENG.TXT 本書(日本語) ESSTVENG.TXT 本書(英語) SSTVENG.DLL エンジン本体 SSTVENG.DEF モジュール定義ファイル SSTVENG.LIB Visual C++ 6.0用のインポートライブラリ MINI.EXE サンプルアプリケーション MINI.LZH サンプルアプリケーションのソース(C++) MINI2.LZH サンプルアプリケーションのソース(C++) MINIVB.LZH サンプルアプリケーションのソース(VB6)  C/C++で書かれたアプリケーションの場合、モジュール定義ファイル(DEF)からインポートライブラリ(LIB)を作成しそれをリンクすると便利です。(LIBファイルはDLLファイルから生成することも可能です。詳細はお使いのコンパイラ/リンカのヘルプを参照して下さい)。関数のプロトタイプ宣言はサンプルソース「MINI.LZH」内の「SSTVENG.H」を利用して下さい。  VBからエンジンを利用する場合、「SSTVENG.DLL」のみでOKだと思います。  サンプル「Mini」および「Mini2」はBorland社のC++Biluder(DelphiのC++版)で書いてあります。あくまでエンジンのデバッグと、その機能の評価のためのコードを記述しているだけで、実用を目的にしたプログラムではありません。 「Mini」と「Mini2」の違いは、チューニングインディケータイメージをエンジン内で作成するか、アプリケーションで作成するかの違いがあるだけです。アプリケーションで独自のデザインのインディケータを作成する場合のサンプルは「Mini2」を参照して下さい。 サンプル「MiniVB」は「Microsoft Visual Basic Ver6.0」で書いてあります。私はVBのコードを書くのはこれが初めてで、決して良いサンプルではありませんが、エンジン内のファンクションの利用方法などは参考にして頂けるかも知れません。 ======================== ◎エンジンが提供する機能 ========================  エンジンはSSTVENG.DLLというDLLファイルで提供されます。アプリケーションはそのDLLをロードし、内部のファンクションを呼び出すことにより、MMSSTVと同じSSTVに関する送受信処理機能を利用する事ができます。  アプリケーションの負荷を低減するため、エンジンはスペクトラム、ウォーターフォール、レベルインディゲータの描画処理もサポートします。更にエンジン内には若干のビットマップ操作ファンクションも準備してあります。  エンジンが持つ低レベルなパラメータはエンジン自身で保存され、またそれを変更することのできるユーザーインターフェース(ダイアログボックス)を提供します。これによりエンジンのサイズは若干大きくなりますが、アプリケーションは煩雑な復調/変調/サウンド関係などの設定画面を自前で準備する必要はなく、より高レベルな機能の実装に専念できます。またエンジン内のそれらの処理に何らかの変更が加られた場合も、アプリケーションを変更する必要がなくなります。 ============ ◎INIファイル ============ エンジンはSSTVENG.INIというファイルをDLLが存在するフォルダに作成します。このファイルにはエンジン内で管理するすべてのパラメータが保存されています。  エンジンがINIファイルをロードするのは、mmsCreate()が呼び出された時です。またセーブするのはmmsDelete()が呼び出されるか、またはDLLがプロセスからデタッチされる時です。 ============================== ◎画像データのインターフェース ============================== エンジンとアプリケーションの画像のインターフェースはWindowsのビットマップハンドルを使います。例えばVBの場合、PictureオブジェクトのHandleプロパティでビットマップハンドルをエンジンに引き渡すことができるかも知れません。ただ1つだけ重要なのは、エンジンに引き渡すすべてのビットマップは必ずDIBでなければならない点です。また受信イメージ、送信イメージ、受信同期イメージ、ウォーターフォールイメージのDIBは必ず24bitフォーマットでなければなりません。  エンジンは以下の6つのビットマップを取り扱います。 - 受信イメージ (800x616) - 送信イメージ (800x616) - 受信同期イメージ (任意のサイズ) - スペクトラムイメージ (任意のサイズ) - ウォータフォールイメージ (任意のサイズ) - レベルインディゲータイメージ (任意のサイズ)  受信イメージおよび送信イメージのサイズは、エンジンが取り扱う可能性がある最大の画像サイズ(800x616)にしておくと、モードによってサイズを変更する必要がなくなります。この方法では送受信時に実際に取り扱う画像サイズはSSTVモードにより変化しますが、例えば320x256の画像を受信する場合、エンジンはビットマップ内の左上隅にそれを描画します。320x256の画像を送信する場合、ビットマップ内の左上隅の範囲を参照します。  受信同期、スペクトラム、ウォータフォール、レベルインディゲータの4つのイメージの描画はオプションです。必要がなければそれらを利用する必要はありません。エンジンはスペクトラムデータおよび信号レベルデータについて、それぞれの生データをアプリケーションに引き渡す方法も別に提供しています。  エンジンのビットマップへの描画は、アプリケーションと同一のスレッドで行われます。したがってアプリケーションでビットマップの共有ロックを操作する必要はありません。この点についてはmmsDoJob()ファンクションの備考を参照して下さい。  受信イメージおよび送信イメージの描画/参照に関して、エンジンはデバイスコンテキスト(DC)を使わず直接イメージにアクセスします。受信同期イメージの描画に関しても通常はDCを使いませんが、周波数のオフセット情報をビットマップ右上に描画する際にDCを使います。  一方スペクトラム、ウォータフォール、レベルインディケータの描画は常にDCを使います。  いずれの場合もデフォルトの動作では、DCはエンジン内で一時的に作成され、アプリケーションにリターンする時に削除されます。  もしこれらのビットマップを割り当てた別のDCが、アプリケーション内に保持されている場合、エンジン内もしくはアプリケーションでそのビットマップへの描画を失敗する可能性があります。このDCの競合は、mmsSetHDC()ファンクションを呼び出すことで解決できます。この場合エンジンはDCを新規に作成せずにアプリケーションから通知されたDCに描画します。  なお、受信イメージおよび送信イメージについては、エンジン内でDCを作成しないので、競合の可能性はありません。  エンジン内にはDIB操作に関して若干のファンクションを準備してあります。詳細はmmsCreateDIB()やmmsDrawDIBdc()などのDIB操作ファンクションを参照して下さい。 ======== ◎文字列 ========  エンジンに引き渡す文字列はすべてANSI文字列で、文字列の最後に0が格納されていなければなりません。エンジンが返す文字列も同じ形式です。 ファンクションの引数でLPCSTR型で宣言されている文字列は、LPSTR型の文字列も引き渡すことができます。LPCSTR型引数はファンクション内で文字列が変更されないことが保証されます。エンジンはその文字列ポインタ自体を保持する訳ではなく、ファンクション内で一時的に参照するだけ(またはエンジン内の別の領域に文字列をコピーする)ので、アプリケーションにリターンした後、その文字列が破棄されても構いません。 ファンクションがLPCSTR型で返す文字列に変更を加えてはなりません。またファンクションは特別な値としてNULLを返す場合があります。VBの場合、mmsStrCopy()またはmmsStrWCopy()を利用し、LPSTR型やLPWSTR型に変換すると取り扱いやすいと思います。 下記にファンクションが返すLPCSTR型の文字列を、VBで取り扱う場合のサンプルを示します(TNX to JE4IVN)。 Public Declare Function mmsGetVersion Lib "SSTVENG.DLL" () As Long Public Declare Function mmsStrCopy Lib "SSTVENG.DLL" (ByVal pDest As String, ByVal cbSize As Long, ByVal pSrc As Long) As Long Public Function getStr(lngSTR As Long) As String Dim strSTR As String * 256 ret = mmsStrCopy(strSTR, 256, lngSTR) getStr = Left$(strSTR, ret) End Function | Text1 = getStr(mmsGetVersion) | ======================== ◎SSTVモードとモード番号 ======================== エンジンがサポートするモードは0から連番のモード番号で表されます。モード番号に対するモードの名前はmmsGetModeName()ファンクションを呼び出して得る事ができます。  エンジンがサポートするモードは将来追加される可能性があります。その際アプリケーションの変更を要しないように、必ずmmsGetModeName()およびmmsGetImageSize()などを呼び出して、モード番号とモード名、イメージのサイズなどを処理するようにして下さい。 ==================== ◎サンプリング周波数 ====================  エンジンは以下の3つのサンプリング周波数をエンジン内で管理しています。 - マスターサンプリング周波数 (MasterSamp) - 受信時サンプリング周波数 (RXSamp) - 送信時サンプリング周波数 (TXSamp)  エンジンはMMSSTVと同様に自動傾き調整および高精度傾き調整をサポートします。したがって受信時サンプリング周波数とマスターサンプリング周波数は異なる可能性があります。  以下に各サンプリング周波数の関連を示します。 RXSamp = MasterSamp + AdjFreq TXSamp = MasterSamp + TxOffset  AdjFreqは自動傾き調整および高精度傾き調整で自動的に算出される内部値で受信開始時の初期値は常に0です。  TxOffsetはサウンドカードが送受で異なるサンプリング周波数を持つ場合にユーザが設定するオフセット値です。  これらの処理はエンジン内で自動的に行われます。またエンジンはその設定ダイアログボックス内に、サンプリング周波数に関する設定項目と較正画面を持ちます。したがってアプリケーションは特別な場合を除きサンプリング周波数を管理する必要はありません。 ================ ◎ファンクション ================  エンジン内のすべてのファンクションは__stdcall呼び出し規約(ファンクション側でスタックを調整する)で記述されています。エクスポートしている名前に修飾はありません。  C/C++からファンクションを利用する場合、例えば次のようなコードを記述し、あらかじめそのアドレスを得ておきます。 typedef LPCSTR (__stdcall *mmsGetVersion)(void); mmsGetVersion fmmsGetVersion; HANDLE hLib = ::LoadLibrary("SSTVENG.DLL"); if( hLib != NULL ){ fmmsGetVersion = (mmsGetVersion)::GetProcAddress(hLib, "mmsGetVersion"); }  ファンクションを呼び出す際は、 LPCSTR pVer = fmmsGetVersion(); のように通常の関数と同じように呼び出します。 また別の方法としてアプリケーションはインポートライブラリ(LIBファイル)を使ってリンクしても構いません(インポートライブラリはDLLファイルまたはDEFファイルから生成できます)。しかしファンクションへの参照をその名前でなく序数で行う場合、エンジンが更新されるとアプリケーションの再コンパイルが必要になる場合があります。したがってインポートライブラリを使用する場合でも、ファンクションは名前で参照するようにしたほうが良いでしょう。 ====================== ◎ファンクションの詳細 ====================== LPCSTR mmsGetVersion(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] "1.00"のような文字列 [解説]  エンジンのバージョン番号を文字列で返します。 LONG mmsLanguage(LONG lang) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] lang - 0:日本語, 1:英語, -1:現在の状態の読み出し [戻り値] 以前の値 [解説]  エンジンが持つmmsOption()のようなダイアログボックス、また問い合わせやエラーメッセージなどで使用する言語を設定します。  このファンクションが一度もコールされない場合、プロセスのロケール情報から使用言語が自動的に決定されます。通常アプリケーションはこのファンクションを呼び出す必要はありません。 LONG mmsCreate(HWND hWnd, ULONG msg) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hWnd : アプリケーションのメインウインドウのハンドル msg : イベント送信で使用するメッセージ値 (e.g., WM_USER) [戻り値]  正常に終了した時はTRUEを返します。失敗した時はFALSEを返します。 [解説]  SSTVエンジンオブジェクトを作成します。エンジン内で管理するパラメータは「SSTVENG.INI」からロードされます。  作成できるオブジェクトは常に1つだけです。既にオブジェクトが作成されている場合は何もしません。  このファンクションを呼び出しても、サウンドカードやCOMデバイスはまだオープンされません。  hWndはNULLを指定する事ができます。その場合、後からmmsSetParent()およびmmsSetMessage()を呼び出し、それぞれのウインドウハンドルをエンジンに通知して下さい。  メッセージ値はアプリケーションがエンジンからのイベントをメッセージで受信する場合にWM_USER以上の任意の値を指定します。メッセージを使用しない場合は0を指定して下さい。  エンジンがアプリケーションに送信するメッセージについては本書の「メッセージ」の項を参照して下さい。 void mmsDelete(void) ~~~~~~~~~~~~~~~~~~~~ [解説] SSTVエンジンオブジェクトを削除します。サウンドカードとCOMデバイスはクローズされエンジンが作成したスレッドは削除されます。保持しているすべてのリソースやメモリが解放されます。また「SSTVENG.INI」にエンジン内で管理するパラメータをセーブします。  既にオブジェクトが削除されている場合は何も行いません。 * アプリケーションがmmsSetBitmap()、mmsSetTuneBitmap()およびmmsSetHDC()でエンジンに通知したビットマップやDCは削除されません。これらはアプリケーションで所有され、削除するのはアプリケーションの責任です。 void mmsStart(void) ~~~~~~~~~~~~~~~~~~~ [解説] サウンドカードやCOMデバイスをオープンしエンジンの動作を開始します。 アプリケーションはmmsCreate()を呼び出した後、mmsStart()を呼び出すまでの間に、少なくとも1回はmmsSetBitmap()を呼び出して、受信イメージおよび送信イメージのDIBのハンドルをエンジンに通知しておかなければなりません。 void mmsStop(void) ~~~~~~~~~~~~~~~~~~ [解説] エンジンの動作を一時的に停止します。再開するにはmmsStart()を呼び出します。  このファンクションはサウンドカードを取り扱う他のエンジン(PSKCORE.DLLやMMTTY.EXEのような)に切りかえる場合に呼び出します。 [備考]  このファンクションではエンジン内で保持している一部のリソースは解放されません。他のエンジンを利用する上でそれが問題になる場合、mmsDelete()を呼び出してオブジェクトそのものを削除して下さい。この場合再開するにはmmsCreate()とmmsStart()を呼び出さなければなりません。 LONG mmsOption(void) ~~~~~~~~~~~~~~~~~~~~ [戻り値]  OKボタンが押された場合TRUEを返します。キャンセルされた場合FALSEを返します。 [解説] エンジンの動作パラメータを設定するためのダイアログボックスを表示します。 void mmsSetOptionTitle(LPCSTR pTitle) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pTitle : タイトルの文字列 [解説] mmsOptionで表示するダイアログボックスのタイトルを設定します。ヌルまたはヌル文字列を設定した場合、デフォルドのタイトルが表示されます。 LONG mmsSetBitmap(HBITMAP hbRX, HBITMAP hbSync, HBITMAP hbTX) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbRX : 受信イメージのDIBのハンドル hbSync: 受信同期イメージのDIBのハンドル hbTX : 送信イメージのDIBのハンドル [戻り値]  正常に終了した時はTRUEを返します。失敗した時はFALSEを返します。 [解説]  受信イメージ、受信同期イメージおよび送信イメージのビットマップのハンドルをエンジンに通知します。エンジンを使用する上でhbRXおよびhbTXは必須です。hbSyncは使用しない場合はNULLを指定することができます。  アプリケーションでビットマップを変更した場合は必ずこのファンクションを呼び出してください。 LONG mmsSetTuneBitmap(HBITMAP hbSpec, HBITMAP hbWater, HBITMAP hbLevel) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbSpec : スペクトラムイメージのDIBのハンドル hbWater: ウォーターフォールイメージのDIBのハンドル hbLevel: レベルインディケータイメージのDIBのハンドル [戻り値]  正常に終了した時はTRUEを返します。失敗した時はFALSEを返します。 [解説]  チューニングインディケータのビットマップのハンドルを通知します。使用しないビットマップはNULLで呼び出して下さい。ただしhbWaterを利用する場合はhbSpecも必須になります。  アプリケーションでビットマップを変更した場合、必ずこのファンクションを呼び出してください。 void mmsSetHDC(HDC hSync, HDC hSpec, HDC hWater, HDC hLevel) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hSync : 受信同期イメージのDCのハンドル hSpec : スペクトラムイメージのDCのハンドル hWater: ウォーターフォールイメージのDCのハンドル hLevel: レベルインディケータイメージのDCのハンドル [解説] アプリケーションでエンジンとのインターフェース用ビットマップのデバイスコンテキスト(DC)を保持している場合、そのDCのハンドルをエンジンに通知します。DCを保持していないビットマップについてはNULLを指定して下さい。  エンジン内での描画は、mmsDoJob(),mmsCorrectSlant(),mmsAdjustPhase()およびmmsSetTuneBitmap()ファンクション内でしか行われません。従ってDCのハンドルが変化する可能性がある場合も、これらのファンクションの直前でこのファンクションを呼び出せばOKです。  詳細は本書の「画像データのインターフェース」を参照して下さい。 void mmsSetSpecRange(LONG base, LONG width) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] base : 左端の周波数(Hz) width : 幅(Hz) [解説]  スペクトラムおよびウォータフォールイメージを描画する際の周波数範囲を設定します。 void mmsSetSpecColor(COLORREF back, COLORREF sig, COLORREF persist, COLORREF marksync, COLORREF marksig) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] back : 背景色 sig : 信号色 persist : 残像信号色 marksync : 同期信号マーカ色 marksig : 画像信号マーカ色 [解説]  スペクトラムイメージを作成する際の色情報を設定します。 void mmsSetWaterColor(COLORREF back, COLORREF sig) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] back : 背景色 sig : 信号色 [解説]  ウォーターフォールイメージを作成する際の色情報を設定します。 LONG mmsGetSampleFreq(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 0 - マスター, 1 - Tx offset, 2 - RX [戻り値] 周波数を100倍した値 (1102500 = 11025.00Hz) [解説] エンジンの動作サンプリング周波数を取得します。 void mmsSetSampleFreq(LONG sw, LONG freq) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 0 - マスター, 1 - Tx offset, 2 - RX freq : 周波数を100倍した値 (1102500 = 11025.00Hz) [解説] エンジンの動作サンプリング周波数を設定します。 void mmsSetClearColor(COLORREF back) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] back : 背景色 [解説]  受信起動時に受信イメージを自動クリアする際の色を設定します。自動クリアのON/OFFはmmsSetRxControl()で設定します。 COLORREF mmsGetClearColor(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] 背景色 [解説]  受信起動時に受信イメージを自動クリアする際の色を得ます。 LONG mmsSetRxControl(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 受信コントロール情報 -1 - 現在の値の読み出し b0 - FSKID受信 b1 - AFC b2 - LMS b3 - Auto restart b4 - Auto stop b5 - Auto resync b6 - Auto slant b7 - Auto clear (see mmsSetClearColor) b16 b17 - 高精度初期同期(0-OFF, 1-Level1, 2-Level2) b20 b21 - 受信バッファ(0-OFF, 1-RAM, 2-File) b24 b25 - 復調器(0-PLL, 1-Zero crossing, 2-hilbert TF) b28 b29 - BPF(0-OFF, 1-broad, 2-sharp, 3-very sharp) [戻り値] 以前(または現在)の値 [解説]  受信コントロール情報の設定/読み出しを行います。 LONG mmsSetTxControl(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 送信コントロール情報 -1 - 現在の値の読み出し b0 : FSKID送信 b1 : CWID送信 b16 - b17 : ループバック(0-OFF, 1-内部, 2-外部) [戻り値] 以前(または現在)の値 [解説]  送信コントロール情報の設定/読み出しを行います。 LONG mmsSetTuneControl(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : チューニングインディケータ設定情報 -1 - 現在の値の読み出し b0 - b3 : スペクトラム感度(0 - 7) b4 - b5 : スペクトラム方式(0-OFF, 1-FFT, 2-FM) b8 - b9 : スペクトラム応答速度(0 - 3) b12 - b13 : スペクトラム残像表示(0 - 3) b16 : スペクトラムAGC b20 : レベル信号Sync表示 b28 - b29 : スペクトラム計算優先順位 (0 - 3) [戻り値] 以前(または現在)の値 [解説]  チューニングインディケータ設定情報の設定/読み出しを行います。mmsGetSpec()ファンクションでスペクトラムの生データを読み出す場合、スペクトラム感度、方式、応答速度のみデータに影響します。エンジン内のスペクトラムイメージ描画機能を利用する場合、すべての設定が影響します。 LPCSTR mmsSetPTTPort(LPCSTR pCom) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pCom : COMポートの名前(e.g, COM1) (NULL - 現在のポート名の読み出し) [戻り値]  正常に終了した時はポート名を返し、失敗した時はNULLを返します。 [解説] エンジン内のPTTコントロールのCOMポートの名前を設定します。  PTTコントロールのデフォルトのポート名は"NONE"です。PTTコントロールに関するすべてのユーザーインターフェースをエンジンに委ねる場合、このファンクションを呼び出す必要はありません。 LPCSTR mmsSetRadioPort(LPCSTR pCom) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pCom : COMポートの名前(e.g, COM1) (NULL - 現在のポート名の読み出し) [戻り値]  正常に終了した時はポート名を返し、失敗した時はNULLを返します。 [解説] エンジン内のRadioCommandポートの名前を設定します。  RadioCommandのデフォルトのポート名は"NONE"です。RadioCommandに関するすべてのユーザーインターフェースをエンジンに委ねる場合、このファンクションを呼び出す必要はありません。 LPCSTR mmsGetRadioFreq(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [戻り値]  読みこみに成功している場合はカレントの周波数の文字列を返します。失敗している場合はNULLを返します。 [解説] RadioCommand経由でRigから読みこんだ周波数を文字列で返します。文字列は例えば"14.230"のように小数点を含むMHzで表現されます。 LONG mmsDisableOption(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 無効情報 -1 - 現在の状態の読みこみ b0 - PTT設定の無効化 b1 - RadioCommand設定ボタンの無効化 b2 - VariSSTVチェックボックスの非表示化 b3 - FSKIDのコールサインボックスの無効化 b4 - CWIDの送出テキストボックスの無効化 b5 - スペクトラムカラーの非表示化 b6 - ウォータフォールカラーの非表示化 b7 - AutoSlantチェックボックスの非表示化 b8 - AutoClear設定の非表示化 [戻り値]  以前(現在)の状態 [解説] エンジンの設定ダイアログボックスmmsOption()の項目について無効(または非表示)を設定します。無効や非表示が設定された項目は、ユーザの操作では変更できなくなります。  このファンクションで設定される無効の状態はINIファイル内には記録されません。デフォルトはすべて有効です。 LONG mmsDoJob(LONG sw) ~~~~~~~~~~~~~~~~~~~~~~ [引数] sw 0-送受信処理のみ 1-チューニング関連の処理も行う [戻り値]  処理結果および状態を表すビット b0 : 受信イメージが更新された b1 : 受信中 b2 : 受信起動された b3 : 送信中 b4 : FSKID受信した b5 : スペクトラムが更新された b6 : RadioCommand周波数が更新された b7 : リピータトーン検出完了 b8 : リピータトーン検出中 b9 : WWV較正処理実行中 [解説] SSTVの送受信や、ビットマップへの描画処理を行います。このファンクションはアプリケーションのウインドウタイマー(200ms程度の間隔)またはTXMS_WAVEメッセージの応答処理内で常に定期的に呼び出さなければなりません。    戻り値のb0が1の場合、受信イメージおよび受信同期イメージのDIBをアプリケーションのウインドウに描画してください。  戻り値のb3が1の場合、mmsGetPos(1)を呼び出し、送信インディケータの位置を更新してください。 swを1で呼び出した場合、スペクトラムの計算処理を実行します。またスペクトラムおよびウォータフォールインディケータのビットマップも更新されます。 [備考]  mmsGetPos(1)で得た送信インディケータが示す位置は、送出中のサウンドの位置に換算されています。送信中に送信ビットマップを更新しても構いませんが、サウンド処理には低レベルなバッファが存在し、また変調処理においてもビットマップの先読み処理を行うため、その更新結果は、インディケータの位置よりも更に下の位置からしか反映されません。  受信起動時にビットマップをクリアしたい場合、mmsSetRxControl()とmmsSetClearColor()で設定して下さい。  ビットマップへの描画は、セーフアクセスを保証するために別スレッドでは行われません。アプリケーション内で送受信中に非常に時間がかかる処理を行う場合、その処理内で適時このファンクションを呼び出す必要があります。またはアプリケーション内でスレッドを1つ作成し、そのスレッド内で本ファンクションを呼び出しても構いません。しかしその場合、ビットマップのセーフアクセスを保証するため、共有ロックを処理するのはアプリケーションの責任になります。 ULONG mmsGetLevel(void) ~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] 下位16bit : 信号レベル 上位16bit : ホールドレベル [解説]  受信信号レベルを返します。レベルインディケータをアプリケーションで描画する場合に呼び出します。このファンクションを呼び出す場合、エンジン内のレベルインディケータイメージの描画機能は使用しないで下さい。 LONG mmsGetSpec(LPLONG pStore) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数]  pStore : 格納先のアドレス(1024点分の領域が必要) [戻り値] 下位16bit : pStoreに格納した数(512 or 1024) 上位16bit : スペクトラム計算周波数[Hz] [解説]  スペクトラム生データを読み出します。スペクトラム、ウォータフォールをアプリケーションで描画する場合に使用します。 スペクトラムと周波数の関係は以下の変換式が適用されます。 n : 格納した数(512 or 1024) x : 位置 s : スペクトラム計算周波数(Hz) f : 任意の点の周波数(Hz) f = (x * s) / (n * 2) x = (f * n * 2) / s スペクトラム計算周波数(s)および格納する点数(n)は、エンジンのマスターサンプリング周波数(m)により変化します。以下に代表的なサンプリング周波数の例を示します。エンジン内でサブサンプリング処理が行われるため、必ずしもmとsが一致しない点に留意して下さい。 m(Hz) s(Hz) n 8000 8000 512 11025 11025 1024 22050 11025 1024 44100 11025 1024 LONG mmsGetSpecDraw(LPLONG pStore, LONG width, LONG max) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pStore : 格納先のアドレス(width分の領域が必要) width : 格納データの横幅 max : 格納データの値の最大値 [戻り値] 格納したデータの数 [解説]  描画用のスペクトラムデータを読み出します。このファンクションではマスターサンプリング周波数の影響を回避できます。エンジンはmmsSetSpecRange()で設定された周波数範囲をwidthの幅に周波数変換します。また格納されるデータはmmsSetTuneControl()で設定するスペクトラム感度、方式、応答速度、AGCの影響を受けます。  エンジン内でwidthの最大値は1600に制限されます。 void mmsGetSpecPersistence(LPLONG pStore) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pStore : 格納先のアドレス [解説]  描画用のスペクトラム残像データを読み出します。このファンクションは必ずmmsGetSpecDraw()とセットで使います。mmsGetSpecDraw()を呼び出した後、mmsGetSpecPersistence()を呼び出して下さい。  pStoreには、mmsGetSpecDraw()のwidthで指定された数のデータが格納され、また個々の値の最大値はmmsGetSpecDraw()のmaxで指定された値になります。データの残像速度はmmsSetTuneControl()のスペクトラム残像表示の影響を受けます。 ULONG mmsGetAFCFQ(void) ~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] 下位16bit : 周波数(Hz) 上位16bit : 0 - Unlock, 1 - Lock [解説] AFC機能によりエンジンが内部でロックしている同期信号周波数を返します。同期信号周波数の標準は1200Hzですが、エンジン内のAFC機能で上下に変化します。このファンクションが返す値は、mmsSetRxControl()のAFC機能がONで、画像受信中でなければ有効でありません。無効の場合は0を返します。 LONG mmsGetWWVFQ(void) ~~~~~~~~~~~~~~~~~~~~~~ [戻り値]  WWVトーン周波数(Hz) [解説] WWV較正処理の際のトーン周波数(デフォルト1000Hz)を返します。値はWWV較正処理実行中のみ有効です。無効の場合は0を返します。 LPCSTR mmsGetModeName(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [戻り値]  モードの名前を表した文字列 (e.g., "Scottie 1") [解説]  エンジン内で管理するモード番号に対するモードの名前を返します。モード番号に対応するモードが存在しない場合、NULLを返します。 ULONG mmsGetModeSize(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [戻り値] 上位16bit : 縦幅 下位16bit : 横幅 [解説] モードで定義されている画像のサイズを返します。このファンクションで返すサイズはエンジンが描画/参照するビットマップの範囲と必ずしも一致しない場合がある点に注意して下さい。ビットマップの範囲を得るにはmmsGetImageSize()を呼び出します。 ULONG mmsGetImageSize(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [戻り値] 上位16bit : 縦幅 下位16bit : 横幅 [解説]  モードに対応するビットマップの描画範囲を返します。エンジンは縦120ラインおよび横160ピクセルのサイズのモードに関して、それぞれ縦240ライン、横320ピクセルに伸縮して取り扱います。このファンクションで返すサイズはその伸縮したサイズになります。 LONG mmsGetModeLength(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [戻り値] そのモードの画像信号部分の送信/受信時間(ms)を返します。 LONG mmsGetModeTiming(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [戻り値] そのモードの水平スキャン時間(ms)を100000倍した値を返します。例えばRobot36の水平スキャン時間は150msですので15000000が返ります。 LONG mmsGetMode(LONG tx) ~~~~~~~~~~~~~~~~~~~~~~~~ [引数] tx : FALSE - 受信モードを返す, TRUE - 送信モードを返す [戻り値] モード番号 [解説] txがFALSEの時、現在受信中または最後に受信した画像のモードを返します。  txがTRUEの時、現在送信中または最後に送信した画像のモードを返します。 void mmsStartScan(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [解説] 画像の受信を強制的に開始します。 void mmsStopScan(LONG enb) ~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] enb : FALSE-自動起動を禁止, TRUE-自動起動を許可 [解説] 画像の受信を強制的に停止します。enbをFALSEで呼び出すと、再びenbをTRUEで呼び出すまで、以降の自動受信起動が禁止されます。 void mmsSendPic(LONG mode) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] mode : モード番号 [解説] 画像の送信を開始します。送信する画像は送信ビットマップが随時参照されます。  ファンクションはすぐに戻りますが、送信動作は画像を最後まで送信するか、mmsSendStop()が呼び出されるまで続きます。 void mmsSendTone(LONG freq) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] freq : 周波数(Hz) [解説] トーン信号の送信を開始します。ファンクションはすぐに戻りますが、送信はmmsSendStop()が呼び出されるまで続きます。 void mmsSendStop(void) ~~~~~~~~~~~~~~~~~~~~~~ [解説] 画像送信またはトーン信号の送信を強制的に終了します。 void mmsSetPTT(LONG tx) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] tx : 0 - RX, 1 - TX [解説] PTT用ComポートおよびRadioCommandのPTTを直接制御します。このファンクションは画像やトーン信号の送信とは無関係に設定されているPTTのみ制御します。このファンクションでPTTをON/OFFした場合、TXMS_PTTメッセージは送信されません。 LONG mmsGetPos(LONG tx) ~~~~~~~~~~~~~~~~~~~~~~ [引数] tx : 0 - 受信位置, 1 - サウンド送信位置, 2 - 送信位置 [戻り値]  縦方向の位置 [解説] txが0の時、現在受信中または最後に受信した画像の位置を返します。  txが1の時、現在送信中または最後に送信したサウンド換算した画像の位置を返します。 txが2の時、現在送信中または最後に送信した画像の変調位置を返します。  エンジンが返す位置は、画像の描画/参照範囲の縦幅を最大スケールとした値です(値は実際の縦幅を上回る場合があります)。以下にモードによる範囲例を示します。 Scottie -1 to 257 Robot24 -1 to 241 ML180 -1 to 497 void mmsReSync(void) ~~~~~~~~~~~~~~~~~~~~ [解説] 現在受信中の同期を強制的に取りなおします(再同期)。なお、一旦再同期を実行すると、その画像受信中の自動傾き調整は禁止されます。 void mmsCorrectSlant(void) ~~~~~~~~~~~~~~~~~~~~~~~~~ [解説] 高精度傾き調整を実行します。MMSSTVの同期画面のニコニコボタンと同じ処理です。処理に時間がかかる場合があります。  このファンクションからリターンした時点で、受信イメージおよび受信同期イメージのビットマップは更新されています。  受信バッファがOFFの場合、高精度傾き調整機能を利用することはできません。 void mmsAdjustPhase(LONG x, LONG xw) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] x : 新しい位置 xw : 横幅 [解説] 受信同期位置を強制的に指定された位置に変更します。XWは水平スキャン時間に相当する値を任意の数値で設定できます。従ってXは0からXWの範囲でなければなりません。XWが0の場合、Xの値に関係無くエンジンが自動的に同期位置を解析します。  このファンクションからリターンした時点で、受信イメージおよび受信同期イメージのビットマップは更新されています。 LPCSTR mmsGetFSKID(void) ~~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] 受信したIDの文字列 [解説] 最後に受信したFSKIDの文字列を返します。 LPCSTR mmsSetFSKID(LPCSTR pCall) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pCall : 送信するIDの文字列 (NULL=送信IDの読み出し) [戻り値]  現在の送信IDを返します。 [解説] 送信FSKIDのコールサインの設定および読み出しを行います。 アプリケーション内でユーザのコールサインを管理している場合、このファンクションを呼び出します。その際、mmsDisableOption()を呼び出し、送信IDの変更操作を禁止しておくと良いでしょう。 LPCSTR mmsSetCWID(LPCSTR pText) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pText : 送信するIDの文字列 (NULL=文字列の読み出し) [戻り値]  現在のCWID文字列を返します。 [解説] 送信CWIDの文字列の設定および読み出しを行います。文字列はmmsOption()のCWIDボックスに表示される文字列で、デフォルトの動作ではその文字列がそのまま送信されます。 CWID文字列内にアプリケーション定義のマクロをサポートすることもできます(mmsSetCWIDCallback()を参照して下さい)。 void mmsSetCWIDCallback(CWIDPROC pFunc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pFunc : コールバック関数のポインタ 1 - メッセージを送信 NULL - コールバック動作なし [解説] エンジンが画像の最後でCWIDを送信する際、アプリケーション内のコールバック関数を呼び出して、送信するCWID文字列のマクロ変換動作を実装します。このファンクションはアプリケーションがマクロをサポートしている場合に使用します。  pFuncの値が1の場合、コールバック関数を呼び出す代わりにウインドウメッセージ(TXMS_CWID)をアプリケーションに送信します。メッセージコールバックについては、本書の「メッセージ」のTXMS_CWIDを参照して下さい。 コールバック関数の型CWIDPROCは、 typedef void (CALLBACK *CWIDPROC)(LPSTR, LONG, LPCSTR); でエンジン内で定義されます。アプリケーション内では次のように宣言し、そのアドレスをmmsSetCWIDCallback()のpFuncで引き渡さなければなりません。 void CALLBACK CWIDCallback(LPSTR pStore, LONG cbSize, LPCSTR pText) pStore : 格納先のバッファのアドレス cbSize : 格納先のバッファのサイズ pText : 参照元の文字列(エンジン内で保持している文字列)  アプリケーションはこの関数内でpTextで引き渡される文字列を変換し、pStoreに実際に送信する文字列を格納しなければなりません。文字列を格納する際、最後の0を含めた長さがcbSizeを越えてはなりません(cbSizeは512で呼ばれます)。 [備考] 送出するCWIDテキストを常にアプリケーション内で管理する場合、コールバックを利用する必要はありません。その場合はmmsDisableOption()を呼び出してCWID文字列の変更操作を禁止し、mmsSetCWID()を呼び出して実際に送信するCWID文字列をエンジンに通知して下さい。 void mmsSetRepeater(LONG sw, LONG tone, LONG sense, LONG t1, LONG t2, LONG sq) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] sw : 0 - OFF, 1 - ON tone : 検出トーン周波数(Hz) sense : 検出感度(0-Highest, 1-Higher, 2-lower, 3-lowest) t1 : トーンONのトリガ時間(ms) t2 : トーンOFFの判定時間(ms) sq : 相関スケルチレベル(0の時は相関器はOFF) [解説] リピータトーン検出機能の設定を行います。エンジンがリピータトーンを検出するとTXMS_DETREPメッセージを送信します。またmmsDoJob()のb7が1で返ります。  このファンクションで設定するパラメータはSSTVENG.INI内に記録されません。したがってアプリケーションはリピータトーン検出機能を使用する場合は、必ずこのファンクションを呼び出してパラメータを設定する必要があります。 MMSSTVの場合、トーン検出パラメータのデフォルトは以下の通りです。 tone : 1750 sense : 2 t1 : 1500 t2 : 500 sq : 6000 LONG mmsGetRepSQ(void) ~~~~~~~~~~~~~~~~~~~~~~ [戻り値]  相関信号レベル [解説]  相関信号レベルを返します。相関器はリピータトーンの検出機能が有効でなければ働きません。画像受信中は相関器は動作しないので返す値に意味はありません。 アプリケーションは自動運転で画像を送信する場合、QRMを回避するために相関信号レベルを監視することをお勧めします。 void mmsSendCWID(LPCSTR pText) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pText : CWIDの文字列 [解説] CWIDを送信します。送信を完了するまでアプリケーションに戻りません。このファンクションはリピータトーン検出時に応答メッセージを送信するために使用します。 LONG mmsSetNotch(LONG freq) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] freq : ノッチ周波数[Hz] (0:OFF, -1:状態の読み出し) [戻り値] 以前のまたは現在のノッチ周波数 [解説] 指定した周波数で受信用ノッチフィルタをアクティブにします。この情報はINIファイルには記録されません。デフォルトは常に0です。 HBITMAP mmsCreateDIB(LONG width, LONG height) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] width : DIBの横幅 height : DIBの縦幅 [戻り値]  作成したDIBのハンドル [解説]  24bitフォーマットのDIBを作成しそのハンドルを返します。 [備考] Microsoft Visual C++ でアプリケーションを開発する場合、このファンクションが返すHBITMAPを、CBitmapクラスに結び付けて使うと便利です。例えば、 CBitmap m_bmpRX; m_bmpRX.Attach(mmsCreateDIB(800, 616)); のようにします。なおアプリケーション終了時には m_bmpRX.DeleteObject(); を呼び出しビットマップを削除して下さい。 LONG mmsDeleteDIB(HBITMAP hbDest) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbDest : DIBのハンドル [戻り値]  成功するとTRUR, 失敗するとFALSE [解説] DIBを削除します。このファンクションはWindows APIのDeleteObject()を呼び出します。 void mmsDrawDIBdc(HDC hDC, LPRECT prcDest, HBITMAP hbSrc, LPRECT prcSrc, int smode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hDC : 描画先のデバイスコンテキストのハンドル prcDest : 描画先の範囲 hbSrc : 参照元DIBのハンドル prcSrc : 参照元の範囲 smode : 伸縮モード [解説] デバイスコンテキストにDIBを描画します。 prcSrcがNULLの場合、DIBのすべての範囲が参照元になります。prcDestがNULLの場合、prcSrcと同じサイズで座標(0, 0)からに描画します。  参照元と描画先のサイズが異なる場合、イメージは伸縮して描画されます。その場合、smodeの値の伸縮モードを適用します(伸縮モードの詳細はWindows APIマニュアルを参照して下さい)。 伸縮モードの値は以下で定義されています。 BLACKONWHITE 1 WHITEONBLACK 2 COLORONCOLOR 3 HALFTONE 4 [例] HBITMAP m_hbLevel; // ビットマップの構築とエンジンへの通知 m_hbLevel = mmsCreateDIB(30, 100); mmsSetTuneBitmap(NULL, NULL, m_hbLevel); // レベルインディケータをビットマップに描画 mmsDoJob(1); // ビットマップをウインドウに描画 // (hdcLevel = アプリケーション内の描画先のデバイスコンテキスト) mmsDrawDIBdc(hdcLevel, NULL, m_hbLevel, NULL, HALFTONE); // ビットマップの削除(アプリケーション終了時) mmsDeleteDIB(m_hbLevel); void mmsDrawDIBwnd(HWND hWnd, LPRECT prcDest, HBITMAP hbSrc, LPRECT prcSrc, int smode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hWnd : 描画先のウインドウのハンドル prcDest : 描画先の範囲 hbSrc : 参照元DIBのハンドル prcSrc : 参照元の範囲 smode : 伸縮モード [解説] 描画先がウインドウのクライアント領域であること以外はmmsDrawDIBdc()と同じです。 void mmsDrawDIBbmp(HBITMAP hbDest, LPRECT prcDest, HBITMAP hbSrc, LPRECT prcSrc, int smode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbDest : 描画先のDIBのハンドル prcDest : 描画先の範囲 hbSrc : 参照元DIBのハンドル prcSrc : 参照元の範囲 smode : 伸縮モード [解説] 描画先がDIBであること以外はmmsDrawDIBdc()と同じです。 void mmsDrawDCbmp(HBITMAP hbDest, LPRECT prcDest, HDC hdcSrc, LPRECT prcSrc, int smode) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbDest : 描画先のDIBのハンドル prcDest : 描画先の範囲 hdcSrc : 参照元デバイスコンテキストのハンドル prcSrc : 参照元の範囲 smode : 伸縮モード [解説] デバイスコンテキストのイメージをDIBに描画します。 prcDestがNULLの場合、DIBのすべての範囲が描画先になります。prcSrcがNULLの場合、prcDestと同じサイズで座標(0, 0)からが参照元になります。  参照元と描画先のサイズが異なる場合、イメージは伸縮して描画されます。その場合、smodeの値の伸縮モードを適用します(伸縮モードの詳細はWindows APIマニュアルを参照して下さい)。 void mmsDrawTransDIBdc(HDC hDC, LONG x, LONG y, HBITMAP hbSrc, COLORREF key) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hDC : 描画先のデバイスコンテキストのハンドル x : 描画位置左上隅のX座標 y : 描画位置左上隅のY座標 hbSrc : 参照元DIBのハンドル key : 参照元の透過キー色 [解説]  参照元DIBをデバイスコンテキストに描画します。その際、参照元DIB内のkeyで指定される色はすべて透明になります。keyに-1 (0xffffffff)を指定すると、透過キー色として参照元DIBの左下隅の色が適用されます。 void mmsDrawTransDIBbmp(HBITMAP hbDest, LONG x, LONG y, HBITMAP hbSrc, COLORREF key) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbDest : 描画先のDIBのハンドル x : 描画位置左上隅のX座標 y : 描画位置左上隅のY座標 hbSrc : 参照元DIBのハンドル key : 透過キー色 [解説] 描画先がDIBであること以外はmmsDrawTransDIBdc()と同じです。 void mmsCopyDIB(HBITMAP hbSrc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbSrc : 参照元のDIBのハンドル [解説]  ビットマップをクリップボードにコピーします。 HBITMAP mmsPasteDIB(void) ~~~~~~~~~~~~~~~~~~~~~~~~ [戻り値] 作成したDIBのハンドル [解説]  クリップボードからDIBを作成します。クリップボードにビットマップイメージが存在しない場合はNULLを返します。 HBITMAP mmsLoadDIB(LPCSTR pName) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pName : BMPファイルのパス名 [戻り値] 作成したDIBのハンドル [解説]  ファイルからビットマップイメージを読みこみDIBを作成します。作成に失敗するとNULLを返します。 LONG mmsSaveDIB(LPCSTR pName, HBITMAP hbSrc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pName : BMPフィアルのパス名 hbSrc : 参照元のDIBのハンドル [戻り値]  成功した時TRUE, 失敗した時FALSE [解説]  DIBをファイルに保存します。 void mmsFillDIB(HBITMAP hbDest, COLORREF col) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hbDest : DIBのハンドル col : 色 [解説]  DIBを指定した色で塗りつぶします。DIBが24bitフォーマットの場合、ファンクションはDCを使用しません。24bitフォーマット以外ではデバイスコンテキストを使います。 LONG mmsGetDIBSize(LPRECT prc, HBITMAP hbSrc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] prc : サイズを格納するRECTのポインタ hbSrc : DIBのハンドル [戻り値] 上位16bit : 縦幅 下位16bit : 横幅 [解説]  指定したDIBのピクセルサイズを返します。prcにRECTのポインタを指定している場合、DIBのピクセルサイズが以下のように格納されます。 rc.left = 0 rc.top = 0 rc.right = 横幅 rc.bottom = 縦幅  prcにNULLを指定すると格納は行われません。 HWND mmsSetParent(HWND hWnd) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hWnd : 親ウインドウのハンドル [戻り値] 以前のハンドル [解説]  エンジン内で表示するダイアログボックスや問い合わせメッセージの親ウインドウのハンドルを設定します。このファンクションを呼び出さない場合、mmsCreate()のhWndのハンドルが親ウインドウになります。 アプリケーションでまだウインドウが作成されていない状態でmmsCreate()を呼び出す場合、そのhWndをNULLにしておき、後からこのファンクションで親ウインドウのハンドルを設定できます。 HWND mmsSetMessage(HWND hWnd, ULONG msg) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] hWnd : メッセージ送信先のハンドル msg : メッセージ値 (e.g. WM_USER) [戻り値] 以前のハンドル [解説]  エンジンがアプリケーションに送信するメッセージの送り先ウインドウのハンドルとメッセージ値を設定します。このファンクションを呼び出さない場合、mmsCreate()のhWndのハンドルにメッセージを送信します。 アプリケーションでまだウインドウが作成されていない状態でmmsCreate()を呼び出す場合、そのhWndをNULLにしておき、後からこのファンクションでメッセージ送信先のウインドウのハンドルを設定できます。また親ウインドウとメッセージ送信先のウインドウが異なる場合も、mmsSetParent()とmmsSetMessage()を呼び出して、ウインドウハンドルを個別に設定できます。 LONG mmsStrCopy(LPSTR pDest, LONG cbSize, LPCSTR pSrc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pDest : 格納先のバッファ cbSize : バッファのバイトサイズ pSrc : 参照元文字列 [戻り値] 格納した文字の数 [解説] エンジンが返すLPCSTR型文字列をLPSTR型に変換します。pSrcがNULLの場合、pDestにはヌル文字列("")が格納されます。文字列の最後に0が1バイト格納されます。 LONG mmsStrWCopy(LPWSTR pDest, LONG cwSize, LPCSTR pSrc) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] pDest : 格納先のバッファ cwSize : バッファのワードサイズ pSrc : 参照元文字列 [戻り値] 格納した文字(ワード)の数 [解説] エンジンが返すLPCSTR型文字列をLPWSTR型に変換します。pSrcがNULLの場合、pDestにはヌル文字列("")が格納されます。文字列の最後に0が2バイト格納されます。 ============ ◎メッセージ ============  エンジンからアプリケーションへのイベントの通知はウインドウメッセージを介して行われます。  エンジンがアプリケーションに通知するイベントには次のようなものがあります。 TXMS_WAVE 0 定期的なサウンド更新イベント TXMS_PTT 1 送受の切り替えイベント TXMS_SCAN 2 受信開始/終了イベント TXMS_FSKID 3 FSKID受信イベント TXMS_DETREP 4 リピータトーン検出イベント TXMS_CWID 5 CWID送信時のコールバックイベント  しかし、これらのイベントメッセージを使わなくても、ウインドウタイマーを利用して定期的にmmsDoJob()ファンクションを呼び出し、状態をポーリングして処理することもできます。エンジン内には送受信のバッファが存在し、アプリケーションの処理応答が遅れても問題がないように設計されています。  メッセージを使用する場合はmmsCreate()ファンクションで、メッセージ番号を指定します。メッセージ番号は通常WM_USER以上の値で、アプリケーション内で他と競合しない値を使います。 TXMS_WAVE ~~~~~~~~~ wParam : TXMS_WAVE=0 lParam : 0 [解説] サウンド入出力スレッドからの定期的なメッセージです。アプリケーションはこのタイミングでmmsDoJob()ファンクションを呼び出します。 TXMS_PTT ~~~~~~~~ wParam : TXMS_PTT=1 lParam : 0 - 受信, 1 - 送信 [解説]  エンジン内の送受のPTT切り替えの際に送信されます。このメッセージに応答することにより、アプリケーションはアプリケーション内のPTT切り替えインターフェースを使用できます。 TXMS_SCAN ~~~~~~~~~ wParam : TXMS_SCAN=2 lParam : 0 - SCAN終了, 1 - SCAN開始 [解説]  受信スキャンの開始および終了時に発生します。  アプリケーションでSSTVモードにより動的に受信イメージのサイズを変更する必要がある場合、TXMS_SCANイベントのタイミングで、ビットマップのサイズを変更できます。この時mmsGetImageSize()を呼び出してモードに対するイメージのサイズを得て下さい。ビットマップのサイズを変更した際は必ずmmsSetBitmap()を呼び出して変更されたビットマップのハンドルをエンジンに通知して下さい。 TXMS_FSKID ~~~~~~~~~~ wParam : TXMS_FSKID=3 lParam : 0 [解説] FSKIDを受信した際に発生します。このメッセージの応答処理内でmmsGetFSKID()ファンクションを呼び出して、受信したIDを得ることができます。 TXMS_DETREP ~~~~~~~~~~~ wParam : TXMS_DETREP=4 lParam : 0 [解説] リピータトーンを検出した際に発生します。リピータトーン検出機能がOFFの場合、このメッセージは送信されません。 このメッセージに応答した際(またはmmsDoJob()ファンクションのb7が1の場合)、エンジンは既にリピータトーンの検出を終了しています。アプリケーションはSendCWID()を呼び出してリピータの応答用CWIDを送信して下さい。 TXMS_CWID ~~~~~~~~~ wParam : TXMS_CWID=5 lParam : 参照元文字列のアドレス [解説] mmsSetCWIDCallback()のpFuncが1の場合、エンジンはこのメッセージを送信し、アプリケーションで変換された文字列をCWIDとして送信します。アプリケーションはこのメッセージの応答関数内で変換した文字列のアドレスをメッセージの戻り値としなければなりません。戻り値がNULLの場合、エンジンは参照元文字列をそのまま送信します。 ====== ◎履歴 ====== [Ver 1.03 -> 1.04] - mmsOptionにTx Buffer設定を追加 - mmsGetPosに送信変調位置を返す機能を追加 - mmsSetNotchのバグを修正 - mmsSetOptionTitleファンクションの追加 [Ver 1.02 -> 1.03] - ファンクションの追加 mmsGetDIBSize, mmsSetPTT, mmsDrawTransDIBdc, mmsDrawTransDIBbmp, mmsSetNotch [Ver 1.01 -> 1.02] - mmsDeleteのバグの修正 - AutoClear設定がINIファイルにセーブされないバグの修正 - mmsOptionにAutoClear設定を追加 - ファンクションの追加 mmsDeleteDIB, mmsFillDIB, mmsGetClearColor [Ver 1.00 -> 1.01] - mmsDeleteのバグの修正 - ファンクションの追加 mmsDrawDCbmp [Ver 0.03 -> 1.00] - ファンクションの追加 mmsGetModeTiming, mmsSetParent, mmsSetMessage mmsStrCopy, mmsStrWCopy [Ver 0.01 -> 0.03] - リピータトーン検出機能の追加 mmsSetRepeater, mmsSetRepSQ, mmsSendCWID - その他のファンクションの追加 mmsGetSpecDraw, mmsGetSpecPersistence, mmsGetAFCFQ, mmsGetWWVFQ, mmsAdjustPhase, mmsGetFSKID, mmsSetFSKID, mmsSetCWID, mmsSetCWIDCallback, mmsSetSpecColor, mmsSetClearColor ======== ◎最後に ========  このエンジンはアマチュア無線用のフリーウエアです。このエンジンを利用するアプリケーションがアマチュア無線用フリーウエアであるならば、SSTVENG.DLLをそのパッケージ内に含めて配布しても構いません。また私への連絡は一切必要ありません。自由にやって下さい。 最新のエンジンは以下のURLでダウンロードできます。 http://www.qsl.net/mmhamsoft/ 73, Mako