Site Provided by VE5KC & Kteck Webs

Using the MMSSTV Engine with your programs

(Information for programmers - this file is included in the Engine download file)
MMSSTV Soundcard Engine

Initial release: April 9, 2002 by JE3HHT Makoto Mori
Version 1.06: January 15, 2003 by JE3HHT Makoto Mori
Translated into English by JA7UDE Nobuyuki Oba

======
Preface
======

I have released an SSTV communication program, MMSSTV, with which I have been enjoying lots of SSTV QSOs. However, there is still plenty of room for improvement in MMSSTV, because I am an SSTV beginner and have restrictions on spending my time for the development. In addition, we, radio amateurs, believe a great deal of diversity and individuality with proud traditions.

With this thing and that, I have now decided to release an SSTV engine, which can be used by any application. I hope this engine would give many more chances to the programs and programmers that carry out great SSTV communication.

The engine is implemented as a 32-bit DLL so that it can be used by any 32-bit Windows program. The DSP equipped in the engine is exactly the same as that in MMSSTV.

To define and make the interface of this engine, I have been referring to AE4JY Moe's PSKCore.dll. I am grateful to him for his great PSK engine, which has given me a lot of smart ideas.

I also would like to give my thanks to JE4IVN Hal and VK4AES Erik for debugging the engine. They pointed out a couple of bugs from the VB perspective.

The engine would not be completed without their help. Thank you very much.

===============
Distribution package
===============

The distribution package of the SSTV engine contains the following files:

ESSTVENG.TXT English manual (this document)
SSTVENG.DLL Engine
SSTVENG.DEF Module definition file
SSTVENG.LIB Import library for Visual C++ 6.0
MINI.EXE Sample application
MINI.LZH Source code of the sample application (C++)
MINI2.LZH Source code of the sample application (C++)
MINIVB.LZH Source code of the sample application (VB6)
MINIMFC.LZH Source code of the sample application (MFC)

For applications written in C or C++, it is a good idea to make an import library (LIB) from the module definition file (DEF). An alternative way is to make the LIB file from the DLL file. Consult the help document of your compiler/linker how to do that. The prototypes of the functions are available in SSTVENG.H, which is packed in MINI.LZH.

The sample applications, MINI and MINI2, are coded in Borland C++Builder. I wrote them for the debug and evaluation purposes, and therefore they would not offer practical use.
In MINI, the tuning indicator image is generated by the engine. In MINI2, on the other hand, the image is generated by the application. Refer to MINI2 if you want to make your own indicator in the application.

A sample VB code, MiniVB, is included in the distribution package. It is my very first VB program using "Microsoft Visual Basic Version 6.0." I do not think it is a good sample code, but I am happy if it would be informative on the use of functions provided in the engine.

MiniMFC, is a sample Microsoft Visual C++ 6.0 project. It should be noted that the project refers to the functions in the VC LIB by using an ordinal number rather than a name. For this reason, you have recompile the project if SSETENG.DLL is updated.

 

==========================
Functions provided by the engine
==========================

The engine is implemented as SSTVENG.DLL. The application making use of the engine loads the DLL and calls its internal functions in order for the SSTV TX and RX operations.

To reduce the load of the application, the engine offers the spectrum, waterfall, and level indicator functions. Besides them, the engine has some bitmap handling functions.

The low-level parameters in the engine are kept in the engine itself. The engine provides a user interface (i.e., a dialog box) for users to change the parameters. This makes the engine slightly bigger, but the application does not have to provide a setup window for modulation, demodulation, and sound processing; the application will be able to concentrate on the implementation of high-level processing. Another merit of this approach is that the application can always make use of the latest SSTV engine. The engine is likely to be updated in the future.

 

=====
INI file
=====

The engine creates SSTVENG.INI in the directory where the DLL exists. The INI file records all the parameters used in the engine.

The engine loads the parameters from the INI file when mmsCreate() is called. It restores the parameters to the INI file either when mmsDelete() is called or when DLL is detached from the process.

======================
Interfaces for the image data
======================

The interface between the engine and application uses Windows bitmap handles. VB, for example, would be able to pass the bitmap handles using picture object handles. It should be noted that the bitmap must be in the DIB format. In addition, the RX, TX, RX synchronization, and waterfall images must all be 24-bit DIB.

The engine handles the following six bitmap images:

- RX image (800x616)
- TX image (800x616)
- RX synchronization image (arbitrary size)
- Spectrum image (arbitrary size)
- Waterfall image (arbitrary size)
- Level indicator image (arbitrary size)

The data size of TX and RX image should be 800x616, which is the biggest size in the SSTV modes that the engine supports. If doing so, the application does not have to change the data size in accordance with the SSTV modes. For example, when the engine receives a 320x256 image, it draws the image in the upper left corner of the bitmap data area. When the engine transmits a 320x256 image, it reads the data in the upper left corner, likewise.

The RX synchronization, spectrum, waterfall, and level indicator images are optional. If you do not use them, you can just ignore them. The engine provides another means to handle the raw data of the spectrum and the signal level for the application.

The bitmap drawing process of the engine is done in the same thread of the application. Therefore, the application does not have to pay attention to the atomicity of bitmap sharing (exclusive access to the bitmap). Refer to the note of mmsDoJob() for more information.

When the engine writes the RX image or reads the TX image, it directly accesses the image without using the device context. The engine does not use the device context for drawing the RX synchronization image, but it does for drawing the frequency-offset information at the top right corner of the bitmap.

For drawing the spectrum, waterfall, and level indicator images, on the other hand, the engine always uses the device context.

In any cases stated above, the device contexts are temporarily generated in the engine and automatically deleted at the timing of return to the application.

If the application has other device contexts dedicated to the bitmap, the engine or application might fail in bitmap drawing. This conflict in the device context can be solved by calling mmsSetHDC(). In this case, the engine does not newly create a device context, but draws a picture using the device context that the application passes to the engine.

There is no possibility of the conflict in the RX and TX images, since the engine does not create a device context for them.

The engine offers some functions for the DIB manipulation. Refer to mmsCreateDIB() and mmsDrawDIBdc() for more information.

 

============
Character string
============

The character string, which is passed to the engine, must be in the ANSI string format and have NULL as the terminator. The engine returns the character string in the ANSI string format.

Parameters of LPCSTR character string type can be of LPSTR type for function call. It is guaranteed that the parameter of LPCSTR type is not modified by the function. The engine will not keep the pointer, but it just refers to the pointer or copies the string to the other place. Therefore, the application can discard the character string after the engine returns the program control to the application. If the character string returned by the function is of LPCSTR type, the application must not modify the string. The function returns NULL in special cases. It would be convenient for Visual Basic to convert it to LPSTR or LPWSTR using mmsStrCopy() or mmsStrWCopy().

Here is a sample code that handles the returned LPCSTR-type character string (thanks 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 modes and mode numbers
========================

Sequential numbers starting with 0 are assigned to the SSTV modes. The mode name can be obtained by calling mmsGetModeName(). There is every possibility that new SSTV modes are added to the engine in the future. For this reason, be sure to use mmsGetModeName() and mmsGetImageSize() for processing the mode number, mode name, and image size.

================
Sampling frequencies
================

The engine takes care of the following three sampling frequencies:
- Master sampling frequency (MasterSamp)
- RX sampling frequency (RXSamp)
- TX sampling frequency (TXSamp)

The engine supports the automatic slant adjustment and the high accuracy slant adjustment as MMSSTV does. Therefore, the RX sampling frequency may be different from the master sampling frequency.

The relationship between these sampling frequencies is defined as follows:

RXSamp = MasterSamp + AdjFreq
TXSamp = MasterSamp + TxOffset

AdjFreq is an internal value, which is calculated in the automatic slant adjustment or highly accurate slant adjustment procedure. The value of AdjFreq is always set to zero when the engine starts receiving the RX image.

TxOffset is used to compensate the frequency discrepancy between RX and TX in the soundcard. For some unknown reason, many recent soundcards have slightly different frequencies in RX and TX.

The engine automatically computes and sets these frequencies. The user can change them in the setup dialog box, so the application does not have to take care of them except few special cases.

=======
Functions
=======

All the functions in the engine comply with __stdcall calling rule (the function adjusts the stack). There is no modifier added to the exported names.

Here is a C/C++ sample code that obtains the function addresses.

typedef LPCSTR (__stdcall *mmsGetVersion)(void);
mmsGetVersion fmmsGetVersion;

HANDLE hLib = ::LoadLibrary("SSTVENG.DLL");
if( hLib != NULL ){
fmmsGetVersion = (mmsGetVersion)::GetProcAddress(hLib, "mmsGetVersion");
}

You can call the function like

LPCSTR pVer = fmmsGetVersion();

An alternative way to call functions is to use the import library (LIB). The import library can be generated from the DLL or DEF file. However, if you use ordinal number for function calling and the engine is updated, you may have to recompile the application. So I would recommend that you call the functions by name.

==============
Details of functions
==============

LPCSTR mmsGetVersion(void)
~~~~~~~~~~~~~~~~~~~
[Return value]
Character string like "1.00".
[Remarks]
It returns the version number of the engine.

LONG mmsLanguage(LONG lang)
~~~~~~~~~~~~~~~~~~~~
[Parameter]
lang = 0:Japanese, 1:English, -1:Read the current set
[Return value]
The previous value (write) or current value (read)
[Remarks]
It specifies the language used in the dialog box, query box, and error messages. If the function is not called, the engine automatically sets the language by referring to the locale information of Windows OS. The application will not have to use this function under normal conditions.

 

LONG mmsCreate(HWND hWnd, ULONG msg)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hWnd : Handle of the main window of the application
msg : Message value for the event transmission (e.g., WM_USER)
[Return value]
TRUE if succeeded
FALSE if failed.
[Remarks]
This function creates an SSTV engine object. The parameters used in the engine are loaded from the SSTVENG.INI file. You can create only one object at any time. If the object has already been created, the function does nothing.
Even if this function was called, the soundcard or COM device is not yet opened.
You can put NULL to hWnd. If you do so, call mmsSetParent() and mmsSetMessage() to notify the engine of the window handles.
Any value greater than WM_USER can be assigned to the message value if the application wants to receive event messages from the engine. In case you are not using the message, put 0 to msg.
Refer to Message Section of this document for more about the messages that the engine sends to the application.

void mmsDelete(void)
~~~~~~~~~~~~~~
[Remarks]
This function deletes the SSTV engine object. It closes the soundcard and COM device if opened. It also deletes the thread that the engine has created. It releases all the resources and memories. The parameters in the engine are saved to the SSTVENG.INI file. If the object has already been deleted, nothing happens.
It does not delete the bitmap or device context, which the application notifies the engine by using mmsSetBitmap(), mmsSetTuneBitmap(), and mmsSetHDC(). The application is in charge of handling them properly.

void mmsStart(void)
~~~~~~~~~~~~~
[Remarks]
This function opens the soundcard and COM devices, and gets the engine started. To let the engine know the handles of TX and RX image DIBs, the application must call mmsSetBitmap() at least once after calling mmsCreate() and before calling mmsStart().

void mmsStop(void)
~~~~~~~~~~~~~
[Remarks]
This function gets the engine paused. To restart the engine, call mmsStart(). This function is provided for switching the engines, such as PSKCORE.DLL and MMTTY.EXE, which drive the soundcard.
This function does not release some resources in the engine. It this is problematic, call mmsDelete() to delete the object. To restart the engine, you must call mmsCreate() and mmsStart() again.

LONG mmsOption(void)
~~~~~~~~~~~~~~~
[Return value]
TRUE if the OK button is depressed
FALSE if the CANCEL button is depressed.
[Remarks]
This function opens the dialog box, with which the user can control the parameters of the engine.

void mmsSetOptionTitle(LPCSTR pTitle)
~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pTitle : Pointer to the title string
[Remarks]
This function specifies the title of the dialog box invoked by mmsOption. If NULL or NULL string is passed as the parameter, the default text appears in the dialog box title.

LONG mmsSetBitmap(HBITMAP hbRX, HBITMAP hbSync, HBITMAP hbTX)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hbRX : Handle of RX image DIB
hbSync: Handle of RX synchronization image DIB
hbTX : Handle of TX image DIB
[Return value]
TRUE if succeeded
FALSE if failed.
[Remarks]
This function notifies the engine of the handles of the RX image, RX synchronization image, and TX image. hbRX and hbTX are must. If the RX synchronization image is not in use, you can put NULL in hbSync.
Be sure to call this function if the application changes the bitmaps.

LONG mmsSetTuneBitmap(HBITMAP hbSpec, HBITMAP hbWater, HBITMAP hbLevel)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hbSpec : Handle of the spectrum image DIB
hbWater: Handle of the waterfall image DIB
hbLevel: Handle of the level indicator image DIB
[Return value]
TRUE if succeeded
FALSE if failed
[Remarks]
This function notifies the engine of the bitmaps of indicators, that is, the spectrum, waterfall and level indicator. Put NULL in the handle that is not in use. However, if you use hbWater, you must put a valid handle in hbSpec.
Be sure to call this function if the application changes the bitmaps.

void mmsSetHDC(HDC hSync, HDC hSpec, HDC hWater, HDC hLevel)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hSync : Handle of the device context of the RX synchronization image
hSpec : Handle of the device context of the spectrum image
hWater: Handle of the device context of the waterfall image
hLevel: Handle of the device contest of the level indicator image
[Remarks]
This function notifies the engine of the device contexts, which is held by the application as the interface to the engine. Put NULL for the bitmap that has no device context.
The drawing operation in the engine is activated only in mmsDoJob(), mmsCorrectSlant(), mmsAdjustPhase() and mmsSetTuneBitmap(). For this reason, the application would have to call this function before changing the handle of the device context.

For more information, refer to Image Data Interface Section of this document.

void mmsSetSpecRange(LONG base, LONG width)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
base : Frequency displayed at the left edge (Hz)
width : Frequency display width (Hz)
[Remarks]
This function specifies the frequency range of the waterfall image.

 

void mmsSetSpecColor(COLORREF back, COLORREF sig, COLORREF persist,
COLORREF marksync, COLORREF marksig)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
back : Background color
sig : Signal color
persist : Persistent signal color
marksync : Sync signal marker color
marksig : Image signal marker color
[Remarks]
This function specifies the colors for the spectrum image.

 

void mmsSetWaterColor(COLORREF back, COLORREF sig)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
back : Background color
sig : Signal color
[Remarks]
This function specifies the colors of the waterfall.

 

LONG mmsGetSampleFreq(LONG sw)
~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
sw : 0 - Master, 1 - Tx offset, 2 - RX, 3 - Base
[Return value]
100 times of the frequency (1102500 = 11025.00Hz)
[Remarks]
This function gets the sampling frequencies of the engine.
sw
0 : Master frequency (Clock of mmsOption)
1 : Tx offset frequency (TX offset of mmsOption)
2 : Rx frequency (RX clock after the automatic slant adjustment)
3 : Base frequency (e.g., 1102500, 2205000)

void mmsSetSampleFreq(LONG sw, LONG freq)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Pamamters]
sw : 0 - Master, 1 - Tx offset, 2 - RX
freq : 100 times of the frequency (1102500 = 11025.00Hz)
[Remarks]
This function sets the sampling frequencies of the engine.

void mmsSetClearColor(COLORREF back)
~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
back : Background color
[Remarks]
This function specifies the color that is used to clear the RX image. The ON/OFF of the automatic clear is defined by mmsSetRxControl();

COLORREF mmsGetClearColor(void)
~~~~~~~~~~~~~~~~~~~~~~
[Return value]
Background color
[Remarks]
This function returns the background color, with which the engine clears the RX image window.

LONG mmsSetLMS(LONG sw)
~~~~~~~~~~~~~~~~~~
[Parameter]
sw : LMS filter mode
-1 - Get the current value
0 - LMS noise smoothing
1 - LMS auto notch (fast)
2 - LMS auto notch (slow)
[Return value]
Previous or current value of LMS mode
[Remarks]
�@This function sets and gets the LMS filter mode.

LONG mmsSetRxControl(LONG sw)
~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
sw : RX control settings
-1 - Read the current value
b0 - FSKID RX
b1 - AFC
b2 - LMS
b3 - Auto restart
b4 - Auto stop
b5 - Auto resync
b6 - Auto slant
b7 - Auto clear (see mmsSetClearColor)
b16 b17 - High-accuracy initial sync (0-OFF, 1-Level1, 2-Level2)
b20 b21 - RX buffer (0-OFF, 1-RAM, 2-File)
b24 b25 - Demodulating method (0-PLL, 1-zero crossing, 2-hilbert TF)
b28 b29 - BPF(0-OFF, 1-broad, 2-sharp, 3-very sharp)
[Return value]
The previous value (write) or current value (read)
[Remarks]
This function writes/reads the RX control settings.

 

LONG mmsSetTxControl(LONG sw)
~~~~~~~~~~~~~~~~~~~~~
[Parameter]
sw : TX control settings
-1 - Read the current settings
b0 : FSKID TX
b1 : CWID TX
b16 - b17 : Loopback(0-OFF, 1-Internal, 2-External)
[Return value]
The previous value (write) or current value (read)
[Remarks]
This function writes/reads the TX control settings.

LONG mmsSetTuneControl(LONG sw)
~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
sw : Settings of the tuning indicator
-1 - Read the current settings
b0 - b3 : Spectrum sensitivity (0 - 7)
b4 - b5 : Spectrum mode (0-OFF, 1-FFT, 2-FM)
b8 - b9 : Spectrum response (0 - 3)
b12 - b13 : Spectrum persistency (0 - 3)
b16 : Spectrum AGC
b20 : Sync level mode
b28 - b29 : Priority of spectrum calculation (0 - 3)
[Return value]
The previous value (write) or current value (read)
[Remarks]
This function writes and reads the settings of the tuning indicator. In case the application reads the raw data of the spectrum by using mmsGetSpec(), only the spectrum sensitivity, mode, and responsibility affect the raw data. In case it uses the spectrum drawing function in the engine, on the other hand, all the settings affect the data.

 

LPCSTR mmsSetPTTPort(LPCSTR pCom)
~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pCom : COM port name (e.g., COM1)
(NULL - read the current COM port name in use)
[Return value]
Port name if succeeded
NULL if failed
[Remarks]
This function puts or gets the COM port name used for the PTT control. The default port name is "NONE". If you leave entire PTT control to the engine, you do not have to call this function.

LPCSTR mmsSetRadioPort(LPCSTR pCom)
~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pCom : COM port name (e.g., COM1)
(NULL - read the current COM port name in use)
[Return value]
Port name if succeeded
NULL if failed
[Remarks]
This function puts or gets the COM port name used for the RadioCommand. The default port name is "NONE." If you leave entire RadioCommand control to the engine, you do not have to call this function.

LPCSTR mmsGetRadioFreq(void)
~~~~~~~~~~~~~~~~~~~~
[Return value]
Character string of the current frequency reading if succeeded
NULL if failed
[Remarks]
This function returns the frequency read out that is obtained through the RadioCommand. It returns the frequency in MHz including a decimal point like "14.230".

LONG mmsDisableOption(LONG sw)
~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
sw : Settings to be disabled
-1 - Read the current settings
b0 - Disable the PTT setting
b1 - Disable the RadioCommand setting button
b2 - Make VariSSTV check box invisible
b3 - Disable FSKID call sign box
b4 - Disable CWID text box
b5 - Make the spectrum color invisible
b6 - Make the waterfall color invisible
b7 - Make AutoSlant check box invisible
b8 - Make AutoClear setting invisible
[Return value]
The previous settings (write) or current settings (read)
[Remarks]
This function specifies enable/disable or visible/invisible settings for the items in the setup dialog window. If the specified item is disabled or made invisible, the user cannot change the current setting. The setting information of enable/disable or visible/invisible is not stored in the SSTVENG.INI file. All the items are enable or visible in default at the start time.

LONG mmsDoJob(LONG sw)
~~~~~~~~~~~~~~~~~
[Parameters]
sw 0- TX/RX processing only
1- TX/RX processing with spectrum calculations
[Return value]
The processing results and status
b0 : RX image has been updated
b1 : Picture is being received now
b2 : Picture receive has been started
b3 : Picture is being sent now
b4 : FSKID has been received
b5 : Spectrum has been updated
b6 : RadioCommand frequency has been updated
b7 : Repeater tone has been detected
b8 : Repeater tone is being detected
b9 : WWV calibration is being executed
[Remarks]
This function provides the means of SSTV TX/RX and bitmap drawing. This function must periodically be called by the application (with approximately 200msec interval) or in the handling routine for the TXMS_WAVE message.
If b0 in the return value is 1, draw the RX and RX synchronization image DIBs in the image display windows of the application.
If b3 in the return value is 1, you can call mmsGetPos(1) and update the position of the TX indicator.
If this function is called with sw=1, the engine calculates the spectrum and updates the bitmaps of the spectrum and the waterfall indicator.

[Notes]
The position of the TX indicator, which was obtained by mmsGetPos(1), has been recalculated at the sound stream position being sent now. You could update the TX bitmap during the TX operation, but the bitmap being sent may not immediately be taken the effect. This is because the engine has a low-level buffer and prefetches the bitmap data.

If you want to clear the bitmap in response to the start of RX, use mmSetRxControl() and mmsSetClearColor().
Drawing to the bitmap is done in the same thread of the engine to guarantee the atomic access. If the application does something very time consuming, it must still call this function periodically even during the operation. It is a good idea to make another dedicated thread that periodically calls this function. Care should be taken in that case, however, that the bitmap should be accessed in an atomic manner.

ULONG mmsGetLevel(void)
~~~~~~~~~~~~~~~~~
[Return value]
Lower 16 bits: Signal level
Upper 16 bits: Hold level
[Remarks]
This function returns the signal and hold levels. This is useful for drawing the level indicator in the application. If you call this function, do not use the level bitmap drawing function in the engine at the same time.

LONG mmsGetSpec(LPLONG pStore)
~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pStore : Pointer to the storage area (1024 points required)
[Return value]
Lower 16 bits : Number of data stored in pStore (512 or 1024)
Upper 16 bits : Spectrum calculation frequency (Hz)
[Remarks]
This function reads the raw data of the spectrum. This function is used to draw the spectrum and waterfall in the application.

The following relations are kept between the spectrum and frequency:
n : Number of the stored data (512 or 1024)
x : Position
s : Spectrum calculation frequency (Hz)
f : Frequency at any point (Hz)

f = (x * s) / (n * 2)
x = (f * n * 2) / s

The spectrum calculation frequency (s) and the number of stored data (n) are dependent on the master sampling frequency (m) of the engine. Here are some typical combinations of m, s, and n. It should be noted that m and s are not always the same because of the sub-sampling operation done by the engine.

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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
pStore : Address pointing to the area in which the data is stored
width : Width of the data
max : Maximum value in the stored data
[Return value]
The number of the data stored
[Remarks]
This function reads the spectrum data for drawing. The returned data is not affected by the sampling frequency. The engine generates the spectrum data of 'width' wide by referring to the frequency range defined by mmsSetSpecRange(). The stored data is affected by the spectrum sensitivity, mode, response, and AGC, which all are defined by mmsSetTuneControl().

The maximum value of the width is 1,600.

void mmsGetSpecPersistence(LPLONG pStore)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]

pStore : Address pointing to the area for data storing
[Remarks]
This function reads the spectrum persistent data. It must be used in conjunction with mmsGetSpecDraw(). Call mmsGetSpecDraw() first and then call mmsGetSpecPersistence().
The number of data stored in pStore is defined by parameter 'width' of mmsGetSpecDraw(). The maximum value is specified by parameter 'max' of mmsGetSpecDraw(). The persistency of the data is affected by mmsSetTuneControl().

 

ULONG mmsGetAFCFQ(void)
~~~~~~~~~~~~~~~~~~
[Return value]
Lower 16bit : Frequency (Hz)
Upper 16bit : 0 - Unlock, 1 - Lock
[Remarks]
This function returns the synchronization signal frequency to which the AFC of the engine locks. The default frequency of the synchronization signal is 1200Hz, but it can be changed by AFC. The function returns an effective value only if the AFC is turned on by mmsSetRxControl() and if a picture is being received; otherwise the function returns 0.

 

LONG mmsGetWWVFQ(void)
~~~~~~~~~~~~~~~~~~
[Return value]
�@WWV tone frequency (Hz)
[Remarks]
This function returns the tone frequency for WWV calibration. The default is 1000Hz. The function returns an effective value only if the WWV calibration is in progress; otherwise the function returns 0.

 

LPCSTR mmsGetModeName(LONG mode)
~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
mode: Mode number
[Return value]
Character string of the mode name (e.g., "Scottie 1")
[Remarks]
This function returns the mode name with respect to the mode number. If it finds no mode supported with respect to the given mode number, it returns NULL.

ULONG mmsGetModeSize(LONG mode)
~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
mode : Mode number
[Return value]

Upper 16 bits : Height
Lower 16 bits : Width
[Remarks]
This function returns the picture size of the specified SSTV mode. It should be noted that the returned size would not always be the same as the bitmap size that the engine reads and writes. Use mmsGetImageSize() to get the bitmap size to be accessed.

 

ULONG mmsGetImageSize(LONG mode)
~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
mode: mode number
[Return value]
Upper 16 bits: Height
Lower 16 bits: Width
[Remarks]
This function returns the drawing area of the specified SSTV mode. The engine internally stretches the 160x120-mode image to the 320x240 pixel image. The function returns the stretched picture size.

LONG mmsGetModeLength(LONG mode)
~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
mode: mode number
[Return value]
This function returns the time duration in msec of the TX/RX image.

LONG mmsGetModeTiming(LONG mode)
~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
mode : Mode number
[Return value]
This function returns the horizontal scan time of 100000 times increased. For example, the horizontal scan time of the Robot36 mode is 150 msec; the function returns 150000000.

 

LONG mmsGetMode(LONG tx)
~~~~~~~~~~~~~~~~~~
[Parameter]
tx : FALSE - returns the RX mode
TRUE - returns the TX mode
[Return value]
Mode number
[Remarks]
If tx is FALSE, the function returns the SSTV mode of the currently receiving image or the lastly received image.
If tx is TRUE, the function returns the SSTV mode of the currently transmitting image or the lastly transmitted image.

 

void mmsStartScan(LONG mode)
~~~~~~~~~~~~~~~~~~~~
[Parameter]
mode : mode number
[Remarks]
This function forces the engine to start receiving the image.

void mmsStopScan(LONG enb)
~~~~~~~~~~~~~~~~~~~
[Parameter]
enb : FALSE - disable automatic start
TRUE - enable automatic start
[Remarks]
This function forces the engine to stop receiving the image. If it is called with FALSE in enb, the engine will not start receiving the image automatically.

void mmsSendPic(LONG mode)
~~~~~~~~~~~~~~~~~~~
[Parameter]
mode : mode number
[Remarks]
This function starts the image transmission. The engine reads the TX bitmap image and transmits it. The function returns immediately, but the engine continues the image transmission until the end of the image or until mmsSendStop() is called.

void mmsSendTone(LONG freq)
~~~~~~~~~~~~~~~~~~~
[Parameter]
freq : Frequency (Hz)
[Remarks]
This function makes the engine start sending the tone signal. The function returns immediately, but the engine continues the tone transmission until mmsSendStop() is called.

void mmsSendStop(void)
~~~~~~~~~~~~~~~
[Remarks]
This function forces the engine to terminate the transmission of the image or the tone.

void mmsSetPTT(LONG tx)
~~~~~~~~~~~~~~~~~
[Parameter]
tx : 0 - RX, 1 - TX
[Remarks]
This function directly controls the COM port for the PTT and the radio command. This function works independently with the PTT control associated with an image or tone signals. If you turn the PTT on or off using this function, TXMS_PTT message will not be sent.

LONG mmsGetPos(LONG tx)
~~~~~~~~~~~~~~~~~
[Parameter]
tx : 0 - RX position, 1 - TX sound position, 2 - TX position
[Return value]
Vertical position
[Remarks]
If tx is 0, the function returns the vertical coordinate of the currently receiving position in the image or the position in the lastly received image.
If tx is 1, the function returns the TX sound position in the currently transmitting image or the TX sound position in the lastly transmitted image.
If tx is 2, the function returns the TX modulation position in the currently transmitting image or the TX modulation position in the lastly transmitted image.

The returned position is in the value between the vertical minimal and maximal vertical coordinates of the TX or RX image. The returned position might exceed the vertical size of the real image.

Mode Return value
Scottie -1 to 257
Robot24 -1 to 241
ML180 -1 to 497

void mmsReSync(void)
~~~~~~~~~~~~~~
[Remarks]
This function forces the engine to resynchronize the RX timings. If the resynchronization operation has been invoked, the automatic slant adjustment is disabled until the end of the receive operation of the current image.

void mmsCorrectSlant(void)
~~~~~~~~~~~~~~~~~
[Remarks]
This function gets the high-accuracy slant adjust routine started. It has the same effect as pushing the smiley button of the MMSSTV sync window. It may take substantial time to complete the operation.
When returned, the bitmaps of the RX image and RX synchronization image have been updated. If the RX buffer is not engaged, the application cannot use the high-accuracy slant adjustment.

void mmsAdjustPhase(LONG x, LONG xw)
~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
x : New position
xw : Width
[Remarks]
This functions forces to change the RX synchronization position. XW specifies the value for the horizontal scan time, and therefore x must be in the range from 0 to xw. If 0 is given in xw, the engine automatically analyzes the synchronization position regardless of x.
When the function returns, the bitmaps of the RX image and RX synchronization image have been updated.

 

LPCSTR mmsGetFSKID(void)
~~~~~~~~~~~~~~~~~~
[Return value]
Character string of the received ID
[Remarks]
This function returns the character string of FSKID.

 

LPCSTR mmsSetFSKID(LPCSTR pCall)
~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pCall : Character string of the FSK TX ID
If NULL, then the current ID is returned
[Return value]
Current FSK TX ID
[Remarks]
This function puts and gets the FSK TX ID.

If the application handles the user call sign, use this function. It is a good idea to disable the TX ID change by calling mmsDisableOption().

LPCSTR mmsSetCWID(LPCSTR pText)
~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pText : Character string of CW TX ID
If NULL, then the current ID is returned
[Return value]
Current CW TX ID
[Remarks]
This function puts and gets the CW TX ID. The characters are defined in the CWID box of mmsOption(). In default, the characters are transmitted.
CWID can contain a macro defined in the application. See mmsSetCWIDCallback().

void mmsSetCWIDCallback(CWIDPROC pFunc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pFunc : Pointer to the callback function
1 - Send the message
NULL - No callback action is taken
[Remarks]
This function specifies the callback function to provide a means for the macro operation in the CWID, which is transmitted at the end of TX. This function is used if the application supports the macro operation.
If pFunc is 1, the function sends TXMS_CWID Windows message to the application on behalf of calling the callback function. For details of the message callback, see TXMS_CWID section of this document.

The type of callback function CWIDPROC is defeined as

typedef void (CALLBACK *CWIDPROC)(LPSTR, LONG, LPCSTR);

in the engine. The application must declare it as follows and passes the address using pFunc of mmsSetCWIDCallback().

void CALLBACK CWIDCallback(LPSTR pStore, LONG cbSize, LPCSTR pText)

pStore : Address of the buffer
cbSize : Size of the buffer
pText : Pointer to the text of the CWID stored in the engine

The application should convert the text in pText into the text to transmit and store it in pStore. The size of the text including the NULL terminator must not be larger than cbSize (512).

[Note]
The application does not have to use this callback function if it always manages the TX CW ID. In such a case, call mmsDisableOption() to disable the CW ID change, and call mmsSetCWID() to put the CWID text to the engine.

 

void mmsSetRepeater(LONG sw, LONG tone, LONG sense,
LONG t1, LONG t2, LONG sq)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
sw : 0 - OFF, 1 - ON
tone : Tone frequency (Hz)
sense : Tone detection sensitivity (0-Highest, 1-Higher, 2-lower, 3-lowest)
t1 : Tone ON trigger time (ms)
t2 : Tone OFF detection time (ms)
sq : Correlation squelch level (0 for shutting the correlater off)
[Remarks]
This function specifies the parameters of the repeater tone detector. When the engine detects a repeater tone, it sends the TXMS_DETREP message. It also turns b7 of mmsDoJob() on.
The parameters specified by this function are not recorded in SSTVENG.INI. For this reason, the application must put the parameters by calling this function if it supports the repeater facility.

In MMSSTV, the default values for the tone detection are as follows:
tone : 1750
sense : 2
t1 : 1500
t2 : 500
sq : 6000

LONG mmsGetRepSQ(void)
~~~~~~~~~~~~~~~~~
[Return value]
Correlation signal level
[Remarks]
This function returns the correlation signal level. The correlator works only if the repeater tone detector is active. During the SSTV image RX, the returned value is invalid because the correlator is not working.
It is recommended that the application 'watch' the correlation signal level to avoid QRM, in particular for free running.

void mmsSendCWID(LPCSTR pText)
~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pText : Character string of CWID
[Remarks]
This function gets the CWID transmitted. It does not return until the CWID TX is completed. It is used to send a return message when the engine detects the repeater tone.

LONG mmsSetNotch(LONG freq)
~~~~~~~~~~~~~~~~~~~~
[Parameter]
freq : Notch frequency [Hz] (0: OFF, -1: read the current notch frequency, others: notch frequency)
[Return value]
Read: Current notch frequency
Write: Last notch frequency (the frequency before this function is called)
[Remarks]
This function turns the notch filter on or off. The status is not saved in the INI file. The default value is 0.

HBITMAP mmsCreateDIB(LONG width, LONG height)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
width : DIB width
height : DIB height
[Return value]
Handle of the created DIB
[Remarks]
This function creates a 24-bit DIB and returns its handle.
[Note]
It is convenient for Microsoft Visual C++ developers to attach the returned HBITMAP to CBitmap class. For example, you can do it in the following way.
CBitmap m_bmpRX;
m_bmpRX.Attach(mmsCreateDIB(800, 616));
Do not forget to call
m_bmpRX.DeleteObject();
to delete the calling bitmap at the exit of the application.

LONG mmsDeleteDIB(HBITMAP hbDest)
~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
hbDest : Handle of DIB
[Return value]
TRUE if succeeded, FALSE if failed
[Remarks]
This function deletes the DIB. The function calls DeleteObject() of Windows API.

void mmsDrawDIBdc(HDC hDC, LPRECT prcDest, HBITMAP hbSrc,
LPRECT prcSrc, int smode)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hDC : Handle of the target device context
prcDest : Area of the target
hbSrc : Handle of the source DIB
prcSrc : Area of the source DIB
smode : Stretch/compress mode

[Remarks]
This function draws DIB in the device context.
If prcSrc is NULL, the whole area of the DIB is the source of the image.
If prcDest is NULL, the function draws the image at coordinates (0,0) with the same size of the source image.
If the sizes of the source and destination images are not the same, the function stretches or compresses the image to get it fit to the size of the target rectangle. In such a case, the function uses the stretch/compress mode specified by smode. For the details of the stretch/compress modes, refer to the Windows API manual.

The definition of the stretch/compress modes are:
BLACKONWHITE 1
WHITEONBLACK 2
COLORONCOLOR 3
HALFTONE 4

[Sample code]
HBITMAP m_hbLevel;
// Make bitmap and notify it to the engine
m_hbLevel = mmsCreateDIB(30, 100);
mmsSetTuneBitmap(NULL, NULL, m_hbLevel);

// Draw the level indicator on the bitmap
mmsDoJob(1);

// Draw the bitmap on the window
// (hdcLevel = Device context of the target)
mmsDrawDIBdc(hdcLevel, NULL, m_hbLevel, NULL, HALFTONE);

// Delete the bitmap (when the application terminates)
mmsDeleteDIB(m_hbLevel);

 

void mmsDrawDIBwnd(HWND hWnd, LPRECT prcDest, HBITMAP hbSrc,
LPRECT prcSrc, int smode)
~~~~~~~~~~~~~~~~~
[Parameters]
hWnd : Handle of the target window
prcDest : Drawing area of the target window
hbSrc : Handle of the source DIB
prcSrc : Area of the source DIB
smode : Stretch/compress mode
[Remarks]
The target is the client area of the window. The others are the same as mmsDrawDIBdc().

void mmsDrawDIBbmp(HBITMAP hbDest, LPRECT prcDest, HBITMAP hbSrc,
LPRECT prcSrc, int smode)
~~~~~~~~~~~~~~~~~
[Parameters]
hWnd : Handle of the target DIB
prcDest : Drawing area of the target window
hbSrc : Handle of the source DIB
prcSrc : Area of the source DIB
smode : Stretch/compress mode
[Remarks]
The target is the DIB. The others are the same as mmsDrawDIBdc().

void mmsDrawDCbmp(HBITMAP hbDest, LPRECT prcDest, HDC hdcSrc,
LPRECT prcSrc, int smode)
~~~~~~~~~~~~~~~~~
[Parameters]

hbDest : Handle of the target DIB
prcDest : Drawing area of the target window
hdcSrc : Handle of the source device context
prcSrc : Area of the source device context
smode : Stretch/compress mode
[Remarks]
This function draws the image of the device context to the target DIB.
If prcDest is NULL, the whole area of the target DIB is drawn. If prcSrc is NULL, the size is the same as the prcDest and the start point is (0, 0) in the source.
If the sizes of the source and target are different, the image is stretched or compressed. In that case, the stretch/compress mode is defined in smode. Refer to the Windows API manual for more information on image stretch and compress.

void mmsDrawTransDIBdc(HDC hDC, LONG x, LONG y,
HBITMAP hbSrc, COLORREF key)
~~~~~~~~~~~~~~~~~~~~
[Parameters]
hDC : Handle of the target device context
x : x coordinate of the upper left corner of the image
y : y coordinate of the upper left corner of the image
hbSrc : Handle of source DIB
key : Transparent color key
[Remarks]
This function draws the source DIB on the specified device context. The color defined in key become transparent. When -1 (0xffffffff) is put to key, the transparent color is the color at the lower left corner of the source DIB image.

void mmsDrawTransDIBbmp(HBITMAP hbDest, LONG x, LONG y,
HBITMAP hbSrc, COLORREF key)
~~~~~~~~~~~~~~~~~~~~
[Parameters]
hbDest : Handle of the target DIB
x : x coordinate of the upper left corner of the image
y : y coordinate of the upper left corner of the image
hbSrc : Handle of source DIB
key : Transparent color key
[Remarks]
The target is the DIB. The others are the same as mmsDrawTransDIBdc().

void mmsCopyDIB(HBITMAP hbSrc)
~~~~~~~~~~~~~~~~~~~~~~
hbSrc : Handle of the source DIB
[Remarks]
This function copies the bitmap to the clipboard.

HBITMAP mmsPasteDIB(void)
~~~~~~~~~~~~~~~~~~
[Return value]
Handle of the created DIB
[Remarks]
This function generates DIB from the clipboard. If the clipboard has no bitmap image, the function returns NULL.

HBITMAP mmsLoadDIB(LPCSTR pName)
~~~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
pName : Path name of the BMP file
[Return value]
Handle of the created DIB.
[Remarks]
This function loads a bitmap image from the file and creates DIB. If it fails, it returns NULL.

LONG mmsSaveDIB(LPCSTR pName, HBITMAP hbSrc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
pName : Path name of the BMP file
hbSrc : Handle of the source DIB
[Return value]

TRUE if succeeded, FALSE if failed.
[Remarks]
Save the DIB to the file.

void mmsFillDIB(HBITMAP hbDest, COLORREF col)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
hbDest : Handle of DIB
col : Color
[Remarks]
This function fills the DIB with the specified color. If the DIB is in the 24-bit format, the function does not use device context; otherwise it uses device context.

LONG mmsGetDIBSize(LPRECT prc, HBITMAP hbSrc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
prc : RECT-type pointer to the size
hbSrc : Handle of the DIB
[Return value]
Upper 16 bits : Height
Lower 16 bits : Width
[Remarks]
This function returns the pixel size of the specified DIB. If RECT-type pointer is assigned to prc, the information on the DIB pixel sizes is stored as follows.
rc.left = 0
rc.top = 0
rc.right = Width
rc.bottom = Height
If NULL is assigned to prc, the function does not store these values to prc.

HWND mmsSetParent(HWND hWnd)
~~~~~~~~~~~~~~~~~~~~~~
[Parameter]
hWnd : Handle of the parent window
[Return value]
Previous handle
[Remarks]
This function specifies the handle of the parent window used for dialog boxes, which is displayed by the engine. If the application does not call this function, hWnd of mmsCreate() is the parent window.
A straight tip on this function is to call mmsCreate() with setting NULL in hWnd first, and call this function to specify the handle of the parent window later.

 

HWND mmsSetMessage(HWND hWnd, ULONG msg)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]

hWnd : Handle of the message destination
msg : Message value (e.g., WM_USER)

[Return value]
Previous handle

[Remarks]
This function specifies the handle of the message destination and the message value. If this function is not called, the messages are sent to hWnd of mmsCreate().

If the application calls mmsCreate() before it creates a window, call mmsCreate() with setting NULL in hWnd, and then call this function to specify the message destination. If the message destination is another window than the parent window, you can specify different window handles to the parent and message-destination windows by calling mmsSetParent() and mmsSetMessage(), respectively.

LONG mmsStrCopy(LPSTR pDest, LONG cbSize, LPCSTR pSrc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[Parameters]
pDest : Destination buffer address
cbSize : Buffer size in byte
pSrc : Source character string
[Return value]
Number of characters stored

[Remarks]
This function converts LPCSTR string to LPSTR string. If pSrc is NULL, NULL string ("") is stored in pDest. BYTE 0 is placed at the end of the string.

 

LONG mmsStrWCopy(LPWSTR pDest, LONG cwSize, LPCSTR pSrc)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Parameters]
pDest : Destination buffer address
cwSize : Buffer size in WORD
pSrc : Source character string
[Return value]
Number of WORDs stored

[Remarks]
This function converts LPCSTR string to LPWSTR string. If pSrc is NULL, NULL string ("") is stored in pDest. WORD 0 (two bytes) is stored at the end of the string.

 

============
Messages
============

The engine sends Windows messages to the application in order to notify the events. The messages are:

TXMS_WAVE 0 Periodical sound update event
TXMS_PTT 1 Switch TX/RX event
TXMS_SCAN 2 Start/end RX event
TXMS_FSKID 3 FSKID receive event
TXMS_DETREP 4 Repeater tone detection event
TXMS_CWID 5 Call-back event for CWID TX
TXMS_CLOCKCHANGE 6 Event of the RX clock frequency change

Even if the application does not use these messages, it can communicate with the engine by polling the engine state. To trace the engine state, call mmsDoJob() periodically. The engine is equipped with TX and RX FIFOs to deal with the response delay.
If the application uses the messages, specify the message number using mmsCreate(). The message number should be larger than WM_USER and must not be in conflict with other message numbers.

TXMS_WAVE
~~~~~~~~~
wParam : TXMS_WAVE=0
lParam : 0
[Remarks]
This message is sent from the thread of sound input/output. When it is received, the application should call mmsDoJob().

TXMS_PTT

~~~~~~~~
wParam : TXMS_PTT=1
lParam : 0 - RX, 1 - TX
[Remarks]
This message is sent when the TX/RX switch takes place. By responding this message, the application can realize its PTT interface.

TXMS_SCAN
~~~~~~~~~
wParam : TXMS_SCAN=2
lParam : 0 - SCAN end, 1 - SCAN start
[Remarks]
This message is sent at the start and end timings of SSTV image receive.
If the application needs to change the size of the RX image on the fly in accordance with the SSTV mode, it can change the size in response to TXMS_SCAN. Call mmsGetImageSize() to obtain the image size. Do not forget to notify the engine of the new bitmap handle using mmsSetBitmap().

TXMS_FSKID
~~~~~~~~~~

wParam : TXMS_FSKID=3
lParam : 0
[Remarks]
This message is sent when FSKID is received. The routine that handles this message can obtain the received ID by calling mmsGetFSKID().

TXMS_DETREP
~~~~~~~~~~~
wParam : TXMS_DETREP=4
lParam : 0
[Remarks]
This message is sent when the repeater tone is detected. If the repeater tone detector is turned off, the message is not sent.
When the message is received (or b7 of mmsDoJob() is 1), the engine has already completed the detection of the repeater tone. The application should call SendCWID() to transmit CWID of the repeater.

TXMS_CWID
~~~~~~~~~
wParam : TXMS_CWID=5
lParam : Address of the text string referred
[Remarks]
If pFunc of mmsSetCWIDCallback() is 1, the engine sends this message and transmits CWID defined by the application. The application should return the address of the converted text string. If it returns NULL, the engine transmits the text string defined by lParam.

TXMS_CLOCKCHANGE
~~~~~~~~~~~~~~
wParam : TXMS_CLOCKCHANGE=6
lParam : New RX clock frequency multiplied by 100 (e.g., 1102500 = 11025.00Hz)
[Remarks]
This message is sent every time when the RX clock frequency is changed by the automatic slant adjustment of mmsCorrectSlant().

============
Revision history
============
[Ver 1.05 -> 1.06]
- Improved the speed of mmsDelete
- Added TXMS_CLOCKCHANGE event
- Added custom RadioCommand
- Added custom sound
- Added a Microsoft Visual C++(MFC) sample project, MiniMFC

[Ver 1.04 -> 1.05]
- Fixed mmsStop bug
- Fixed RTS while SCAN bug
- Added a parameter to mmsGetSampleFreq() so that it can return the base frequency
- Added mmsSetLMS()

[Ver 1.03 -> 1.04]
- Added TX buffer parameter to the option dialog box
- Added the function that returns the TX position in the image to mmsGetPos()
- Fixed a bug in mmsSetNotch
- Added mmsSetOptionTitle()

[Ver 1.02 -> 1.03]
- Added several functions
mmsGetDIBSize, mmsSetPTT,
mmsDrawTransDIBdc, mmsDrawTransDIBbmp,
mmsSetNotch

[Ver 1.01 -> 1.02]
- Fixed a bug in the mmsDelete function
- Fixed a bug that does not save the AutoClear setting in the INI file.
- Added Autoclear to mmsOption
- Added three functions:
mmsDeleteDIB, mmsFillDIB, mmsGetClearColor

[Ver 1.00 -> 1.01]
- Fixed a bug in the mmsDelete function
- Added mmsDrawDCbmp function

[Version 0.03 -> 1.00]
- Added several functions
mmsGetModeTiming,
mmsSetParent, mmsSetMessage,
mmsStrCopy, mmsStrWCopy

[Version 0.01 -> 0.03]
- Added the function that detects the repeater tone.
mmsSetRepeater, mmsSetRepSQ, mmsSendCWID
- Added other functions:
mmsGetSpecDraw, mmsGetSpecPersistence,
mmsGetAFCFQ, mmsGetWWVFQ, mmsAdjustPhase,
mmsGetFSKID, mmsSetFSKID, mmsSetCWID, mmsSetCWIDCallback,
mmsSetSpecColor, mmsSetClearColor

 

============
Closing remarks
============

This engine is freeware for the HAM use. If the application using this engine is freeware, it can include SSTVENG.DLL in its distribution package. You do not have to inform me. Feel free to do so, as SSTVENG is freeware.

73, Mako


Please take the time to read the terms of use!

See the Programmer Downloads page to obtain the necessary files.