Skip to content
Snippets Groups Projects
Commit d3e4c4ed authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Support option modem "speaker" (WAV file playback) control via ATM1 (turn on)

Support optional WAV files via .ini keys:
RingSound
ConnectSound
DisconnectSound

ATM0 turns "speaker" (WAV playback) off (the default), ATM1 turns on.

Ignore ATLn (speaker level), ATT (tone) and ATP (pulse) commands. These are
sometimes found in init strings which we don't want to prematurely fail with
a parse failure and "ERROR" result.

Increment version number to 0.2.
parent 2e671622
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #3096 passed
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define NOGDI #define NOGDI
#include <windows.h> #include <windows.h>
#include <process.h> #include <process.h>
#include <mmsystem.h> /* SND_ASYNC */
#include "genwrap.h" #include "genwrap.h"
#include "findstr.h" #include "findstr.h"
...@@ -40,7 +41,7 @@ ...@@ -40,7 +41,7 @@
#include "git_hash.h" #include "git_hash.h"
#define TITLE "Synchronet Virtual DOS Modem for Windows" #define TITLE "Synchronet Virtual DOS Modem for Windows"
#define VERSION "0.1" #define VERSION "0.2"
bool external_socket; bool external_socket;
union xp_sockaddr addr; union xp_sockaddr addr;
...@@ -80,6 +81,9 @@ struct { ...@@ -80,6 +81,9 @@ struct {
bool server_binary; bool server_binary;
char client_file[MAX_PATH + 1]; char client_file[MAX_PATH + 1];
char ip_filter_file[MAX_PATH + 1]; char ip_filter_file[MAX_PATH + 1];
char ring_sound[MAX_PATH + 1];
char connect_sound[MAX_PATH + 1];
char disconnect_sound[MAX_PATH + 1];
char busy_notice[INI_MAX_VALUE_LEN]; char busy_notice[INI_MAX_VALUE_LEN];
char answer_banner[INI_MAX_VALUE_LEN]; char answer_banner[INI_MAX_VALUE_LEN];
enum { enum {
...@@ -145,6 +149,7 @@ struct modem { ...@@ -145,6 +149,7 @@ struct modem {
bool online; // false means "command mode" bool online; // false means "command mode"
bool caller_id; bool caller_id;
bool ringing; bool ringing;
bool speaker;
ulong ringcount; ulong ringcount;
ulong auto_answer; ulong auto_answer;
ulong dial_wait; ulong dial_wait;
...@@ -257,6 +262,8 @@ char* connect_result(struct modem* modem) ...@@ -257,6 +262,8 @@ char* connect_result(struct modem* modem)
char* connected(struct modem* modem) char* connected(struct modem* modem)
{ {
if(modem->speaker && cfg.connect_sound[0])
PlaySound(cfg.connect_sound, NULL, SND_ASYNC|SND_FILENAME);
modem->online = true; modem->online = true;
modem->ringing = false; modem->ringing = false;
ResetEvent(hangup_event); ResetEvent(hangup_event);
...@@ -267,6 +274,8 @@ char* connected(struct modem* modem) ...@@ -267,6 +274,8 @@ char* connected(struct modem* modem)
void disconnect(struct modem* modem) void disconnect(struct modem* modem)
{ {
if(modem->speaker && cfg.disconnect_sound[0])
PlaySound(cfg.disconnect_sound, NULL, SND_ASYNC|SND_FILENAME);
modem->online = false; modem->online = false;
if(!external_socket) { if(!external_socket) {
shutdown(sock, SD_SEND); shutdown(sock, SD_SEND);
...@@ -295,6 +304,7 @@ const char* iniKeyAutoAnswer = "AutoAnswer"; ...@@ -295,6 +304,7 @@ const char* iniKeyAutoAnswer = "AutoAnswer";
const char* iniKeyEcho = "Echo"; const char* iniKeyEcho = "Echo";
const char* iniKeyQuiet = "Quiet"; const char* iniKeyQuiet = "Quiet";
const char* iniKeyNumeric = "Numeric"; const char* iniKeyNumeric = "Numeric";
const char* iniKeySpeaker = "Speaker";
const char* iniKeyCR = "CR"; const char* iniKeyCR = "CR";
const char* iniKeyLF = "LF"; const char* iniKeyLF = "LF";
const char* iniKeyBS = "BS"; const char* iniKeyBS = "BS";
...@@ -311,6 +321,7 @@ void init(struct modem* modem) ...@@ -311,6 +321,7 @@ void init(struct modem* modem)
modem->auto_answer = iniGetBool(ini, section, iniKeyAutoAnswer, FALSE); modem->auto_answer = iniGetBool(ini, section, iniKeyAutoAnswer, FALSE);
modem->echo_off = !iniGetBool(ini, section, iniKeyEcho, TRUE); modem->echo_off = !iniGetBool(ini, section, iniKeyEcho, TRUE);
modem->quiet = iniGetBool(ini, section, iniKeyQuiet, FALSE); modem->quiet = iniGetBool(ini, section, iniKeyQuiet, FALSE);
modem->speaker = iniGetBool(ini, section, iniKeySpeaker, FALSE);
modem->numeric_mode = iniGetBool(ini, section, iniKeyNumeric, FALSE); modem->numeric_mode = iniGetBool(ini, section, iniKeyNumeric, FALSE);
modem->caller_id = iniGetBool(ini, section, iniKeyCallerID, FALSE); modem->caller_id = iniGetBool(ini, section, iniKeyCallerID, FALSE);
modem->cr = (char)iniGetInteger(ini, section, iniKeyCR, '\r'); modem->cr = (char)iniGetInteger(ini, section, iniKeyCR, '\r');
...@@ -330,6 +341,7 @@ bool write_cfg(struct modem* modem) ...@@ -330,6 +341,7 @@ bool write_cfg(struct modem* modem)
iniSetBool(&ini, section, iniKeyAutoAnswer, modem->auto_answer, style); iniSetBool(&ini, section, iniKeyAutoAnswer, modem->auto_answer, style);
iniSetBool(&ini, section, iniKeyEcho, !modem->echo_off, style); iniSetBool(&ini, section, iniKeyEcho, !modem->echo_off, style);
iniSetBool(&ini, section, iniKeyQuiet, modem->quiet, style); iniSetBool(&ini, section, iniKeyQuiet, modem->quiet, style);
iniSetBool(&ini, section, iniKeySpeaker, modem->speaker, style);
iniSetBool(&ini, section, iniKeyNumeric, modem->numeric_mode, style); iniSetBool(&ini, section, iniKeyNumeric, modem->numeric_mode, style);
iniSetBool(&ini, section, iniKeyCallerID, modem->caller_id, style); iniSetBool(&ini, section, iniKeyCallerID, modem->caller_id, style);
iniSetInteger(&ini, section, iniKeyCR, modem->cr, style); iniSetInteger(&ini, section, iniKeyCR, modem->cr, style);
...@@ -832,6 +844,11 @@ char* atmodem_exec(struct modem* modem) ...@@ -832,6 +844,11 @@ char* atmodem_exec(struct modem* modem)
return error(modem); return error(modem);
} }
return respbuf; return respbuf;
case 'L': /* Speaker volume */
break;
case 'M':
modem->speaker = val;
break;
case 'O': case 'O':
if(sock == INVALID_SOCKET) if(sock == INVALID_SOCKET)
return error(modem); return error(modem);
...@@ -917,6 +934,10 @@ char* atmodem_exec(struct modem* modem) ...@@ -917,6 +934,10 @@ char* atmodem_exec(struct modem* modem)
} else } else
return error(modem); return error(modem);
break; break;
case 'P': /* Pulse */
break;
case 'T': /* Tone */
break;
case 'X': case 'X':
modem->ext_results = val; modem->ext_results = val;
break; break;
...@@ -1069,6 +1090,12 @@ bool read_ini(const char* ini_fname) ...@@ -1069,6 +1090,12 @@ bool read_ini(const char* ini_fname)
SAFECOPY(cfg.client_file, p); SAFECOPY(cfg.client_file, p);
if((p = iniGetString(ini, ROOT_SECTION, "IpFilterFile", NULL, value)) != NULL) if((p = iniGetString(ini, ROOT_SECTION, "IpFilterFile", NULL, value)) != NULL)
SAFECOPY(cfg.ip_filter_file, p); SAFECOPY(cfg.ip_filter_file, p);
if((p = iniGetString(ini, ROOT_SECTION, "RingSound", NULL, value)) != NULL)
SAFECOPY(cfg.ring_sound, p);
if((p = iniGetString(ini, ROOT_SECTION, "ConnectSound", NULL, value)) != NULL)
SAFECOPY(cfg.connect_sound, p);
if((p = iniGetString(ini, ROOT_SECTION, "DisconnectSound", NULL, value)) != NULL)
SAFECOPY(cfg.disconnect_sound, p);
return true; return true;
} }
...@@ -1376,6 +1403,8 @@ int main(int argc, char** argv) ...@@ -1376,6 +1403,8 @@ int main(int argc, char** argv)
dprintf("Incoming connection"); dprintf("Incoming connection");
if(now - lastring > RING_DELAY) { if(now - lastring > RING_DELAY) {
dprintf("RING"); dprintf("RING");
if(modem.speaker && cfg.ring_sound[0])
PlaySound(cfg.ring_sound, NULL, SND_ASYNC|SND_FILENAME);
vdd_writestr(&wrslot, response(&modem, RING)); vdd_writestr(&wrslot, response(&modem, RING));
lastring = now; lastring = now;
modem.ringcount++; modem.ringcount++;
......
...@@ -105,6 +105,7 @@ ...@@ -105,6 +105,7 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>netapi32.lib;ws2_32.lib;IPHlpApi.Lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>..\build\gitinfo.bat</Command> <Command>..\build\gitinfo.bat</Command>
...@@ -125,6 +126,7 @@ ...@@ -125,6 +126,7 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>netapi32.lib;ws2_32.lib;IPHlpApi.Lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>..\build\gitinfo.bat</Command> <Command>..\build\gitinfo.bat</Command>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment