Mail Archives: djgpp/1997/04/09/16:20:19
From: | evelkomo AT iamerica DOT net (Trey Chandler)
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | Repost: Fixed Allegro Sound Setup - setup.cc
|
Date: | Wed, 09 Apr 1997 14:15:53 GMT
|
Organization: | LDS I-America
|
Lines: | 534
|
Message-ID: | <334ba3c6.653838@nntp.iamerica.net>
|
Reply-To: | evelkomo AT iamerica DOT net
|
NNTP-Posting-Host: | 205.173.249.27
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Sorry about the encoding. Agent is a strange beast.
------Begin-----------
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include <stdio.h>
#include <dir.h>
#include "allegro.h"
#include "internal.h"
#include "testsnd.h"
#include "setup.h"
#define PROGRAM_NAME "Allegro" //Name of the program this will be used with
#define FLIP_POSITION 17 //Do not change unless main_dlg is modified
#define NUM_DIGI_CARDS 7 //Number of digital cards to choose from
#define NUM_MIDI_CARDS 7 //Number of midi cards to choose from
//Structures to store settings for cards
typedef struct DIGISPECS
{
char name[17];
short maxfreq; //Index in FREQ struct which is max freq
//Card can handle
} DIGISPECS;
typedef struct MIDICARD
{
char *name;
bool usefm; //Does the card use an fm port?
} MIDICARD;
typedef struct FREQ
{
char frequency[16];
} FREQ;
//Function prototypes
void WriteSoundCFG(void);
void CopyFile(char *s, char *d);
int QuitProc(int, DIALOG*, int);
int AutoDetProc(int, DIALOG*, int);
int ChangeDigiCard(int, DIALOG*, int);
int TestDigiCard(int, DIALOG*, int);
void ReadSettings(void);
char *DigiList(int, int*);
int DigiListProc(int, DIALOG*, int);
int SaveQuitProc(int, DIALOG*, int);
int ChangeMidiCard(int, DIALOG*, int);
int MidiListProc(int, DIALOG*, int);
char *MidiList(int, int*);
int ChangeFreq(int, DIALOG*, int);
char *FreqList(int, int*);
int FreqListProc(int, DIALOG*, int);
//List of digital soundcards supported
static DIGISPECS digi[]=
{
{"None", 0},
{"SB (autodetect)", 1},
{"SoundBlaster 1.0", 1},
{"SoundBlaster 1.5", 1},
{"SoundBlaster 2.0", 3},
{"SoundBlaster Pro", 2},
{"SoundBlaster 16", 3},
};
//List of midi cards supported
static MIDICARD midi[]=
{
{"None", 1},
{"OPL (autodetect)", 1},
{"OPL2", 1},
{"Dual OPL2", 1},
{"OPL3", 1},
{"SB Midi", 1},
{"MPU-401", 0},
};
static FREQ freqs[]=
{
{"11906 (386)"},
{"16129 (486)"},
{"22727 (486-DX2)"},
{"45454 (Pentium)"},
};
//Global Variables for current settings
char digi_name[30] = "None";
char midi_name[30] = "None";
char *base_address = "220";
char *irq = "7";
char *dma = "1";
char freq[16] = "0";
int digi_allegro_num = 0;
int midi_allegro_num = 0;
char *midi_port = "388";
bool usefm = 1;
char *flip_stereo = "0";
bool sound_installed = false;
//These were added by Trey Chandler
DATAFILE *setup_data;
//Dialog for main menu
DIALOG main_dlg[]=
{
/* (dialog proc) (x) (y) (w) (h) (fg)(bg)(key) (flags) (d1)(d2)(dp) */
{ d_clear_proc, 0, 0, 0, 0, 255,1, 0, 0, 0, 0, NULL },
{ d_box_proc, 40, 40, 160,220,255,8, 0, 0, 0, 0, NULL},
{ d_box_proc, 440,40, 160,220,255,8, 0, 0, 0, 0, NULL},
{ d_ctext_proc, 320,4, 1, 1, 255,1, 0, 0, 0, 0, PROGRAM_NAME " Sound Setup"
},
{ d_ctext_proc, 320,15, 1, 1, 255,1, 0, 0, 0, 0, "by David Calvin" },
{ d_text_proc, 55, 25, 1, 1, 255,1, 0, 0, 0, 0, "Digital Settings"},
{ d_text_proc, 470,25, 1, 1, 255,1, 0, 0, 0, 0, "Midi Settings" },
{ QuitProc, 240,440,160,25, 255,5, 27, D_EXIT, 0, 0, "Exit Without Saving" },
{ AutoDetProc, 240,40, 160,25, 255,5, 'a', D_EXIT, 0, 0, "Autodetect Settings" },
{ d_text_proc, 50, 60, 160,15, 255,8, 0, 0, 0, 0, "Card Name:" },
{ ChangeDigiCard, 50, 70, 140,25, 255,5, 0, D_EXIT, 0, 0, digi_name },
{ d_text_proc, 50, 100,160,15, 255,8, 0, 0, 0, 0, "Base Address:"},
{ d_edit_proc, 50, 110,120,15, 255,8, 0, 0, 3, 0, base_address},
{ d_text_proc, 50, 130,120,15, 255,8, 0, 0, 0, 0, "IRQ:" },
{ d_edit_proc, 50, 140,120,15, 255,8, 0, 0, 1, 0, irq},
{ d_text_proc, 50, 160,120,15, 255,8, 0, 0, 0, 0, "DMA:" },
{ d_edit_proc, 50, 170,120,15, 255,8, 0, 0, 1, 0, dma},
{ d_check_proc, 50, 190,140,12, 255,8, 0, 0, 0, 0, "Flip Stereo:" },
{ TestDigiCard, 240,360,160,25, 255,5, 0, D_EXIT, 0, 0, "Test Settings" },
{ SaveQuitProc, 240,400,160,25, 255,5, 0, D_EXIT, 0, 0, "Exit and Save"},
{ d_text_proc, 450,60, 160,15, 255,8, 0, 0, 0, 0, "Card Name:"},
{ ChangeMidiCard, 450,70, 140,25, 255,5, 0, D_EXIT, 0, 0, midi_name },
{ d_text_proc, 450,100,160,15, 255,8, 0, 0, 0, 0, "Port:"},
{ d_edit_proc, 450,110,120,15, 255,8, 0, 0, 3, 0, midi_port},
{ d_text_proc, 50, 215,120,15, 255,8, 0, 0, 0, 0, "Mixing Frequency:"},
{ ChangeFreq, 50, 230,140,25, 255,5, 0, D_EXIT, 0, 0, freq},
{ NULL }
};
//Dialog to choose digital card manually
DIALOG digi_list[] =
{
{ DigiListProc, 240,100,160,10*NUM_DIGI_CARDS, 255, 5, 0, D_EXIT, 0, 0, DigiList},
{ NULL },
};
//Dialog to choose midi card manually
DIALOG midi_list[] =
{
{ MidiListProc, 240,100,160,10*NUM_MIDI_CARDS, 255, 5, 0, D_EXIT, 0, 0, MidiList},
{ NULL }
};
DIALOG freq_list[] =
{
{ FreqListProc, 240,100,160,50, 255, 5, 0, D_EXIT, 0, 0, FreqList},
{NULL}
};
int main(int argc, char *argv[])
{
bool autodetect = true;
//Process arguments to main
if(argc > 1)
{
//Check for valid commandline options, otherwise print help message
if(strcmp("-nodetect", argv[1]) == 0)
autodetect = false;
else
{
cout << "setup [options]" << endl << endl;
cout << "Valid options are:" << endl;
cout << " -nodetect Bypasses automatic soundcard detection" <<
" on startup" << endl;
exit(1);
}
}
//Added by Trey
if ( (exists ("setup.dat") ) == 0)
{
printf ("Data file for Setup.exe not found. Exiting.");
exit(1);
}
setup_data = load_datafile("setup.dat");
//setup Allegro
allegro_init();
install_mouse();
install_keyboard();
install_timer();
if (set_gfx_mode(GFX_VESA1, 640, 480, 0, 0) != 0) {
allegro_exit();
cout << "Error setting graphics mode" << endl << allegro_error << endl;
exit(1);
}
set_pallete(setup_data[SETUP_PALLETE].dat);
gui_bg_color = 2;
gui_fg_color = 0;
//If user opted to skip autodetection, or autodetection fails,
//or sound.cfg not found, initialize variables to zero.
if( (file_exists("sound.cfg", FA_RDONLY | FA_ARCH, NULL)) && autodetect)
{
if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0)
autodetect = false;
//Otherwise, read settings
else
{
ReadSettings();
//Make backup of sound.cfg in case user doesn't save changes
CopyFile("sound.cfg", "sound.bak");
sound_installed=true;
}
}
else autodetect = false;
//start main dialog
do_dialog(main_dlg, -1);
exit(0);
}
//Function to copy sound.cfg, for making backups
void CopyFile(char *s, char *d)
{
FILE *in = fopen(s, "rb");
FILE *out = fopen(d, "wb");
int c;
while ((c = fgetc(in)) != EOF)
fputc(c, out);
fclose(in);
fclose(out);
}
//Function to create sound.cfg from global variables.
void WriteSoundCFG(void)
{
delete_file("sound.cfg");
ofstream output("sound.cfg");
output << "digi_card = " << digi_allegro_num << endl;
output << "midi_card = " << midi_allegro_num << endl;
output << "flip_pan = ";
if(main_dlg[FLIP_POSITION].flags == D_SELECTED)
output << 1 << endl;
else
output << 0 << endl;
output << "sb_port = ";
if(midi_allegro_num == 5) //If SB MIDI used, write address
output << midi_port; //to sb_port instead of fm_port
else output << base_address;
output << endl;
output << "sb_dma = " << dma << endl;
output << "sb_irq = " << irq << endl;
output << "sb_freq = " << freq << endl;
output << "fm_port = ";
if(usefm)
output << midi_port;
output << endl;
output << "mpu_port = ";
if(!usefm)
output << midi_port;
output << endl;
output.close();
}
//Exit without saving
int QuitProc(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
//Copy setup.bak to setup.cfg to overwrite any changes
delete_file("sound.cfg");
if(file_exists("sound.bak", FA_RDONLY | FA_ARCH, NULL))
{
CopyFile("sound.bak", "sound.cfg");
delete_file("sound.bak");
}
return D_CLOSE;
}
return D_O_K;
}
//Attempt autodetection
int AutoDetProc(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
if(sound_installed)
remove_sound();
delete_file("sound.cfg");
if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0)
{
alert("Cannot autodetect!", allegro_error, NULL, "Ok", NULL, 0, 0);
return(D_REDRAW);
}
ReadSettings();
sound_installed = true;
return(D_REDRAW);
}
return D_O_K;
}
//Change digital card
int ChangeDigiCard(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
popup_dialog(digi_list, -1);
strcpy(digi_name, digi[digi_list[0].d1].name);
digi_allegro_num = digi_list[0].d1;
//Copy frequency one char at a time to eliminate comment at end
for(int i=0; i<5; i++)
freq[i] = freqs[digi[digi_list[0].d1].maxfreq].frequency[i];
freq[6] = '\0';
return(D_REDRAW);
}
return D_O_K;
}
//Test all soundcard settings
int TestDigiCard(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
if(sound_installed)
remove_sound();
WriteSoundCFG();
if(install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0)
{
alert("Sound Initialization Failed!", allegro_error, NULL, "Ok", NULL, 0, 0);
sound_installed = false;
return(D_REDRAW);
}
else sound_installed=true;
ReadSettings();
play_sample(setup_data[TEST_SAMPLE].dat, 255, 0, 1000, 1);
alert("Playing left channel", NULL, NULL, "Ok", NULL, 0, 0);
stop_sample(setup_data[TEST_SAMPLE].dat);
play_sample(setup_data[TEST_SAMPLE].dat, 255, 255, 1000, 1);
alert("Playing right channel", NULL, NULL, "Ok", NULL, 0, 0);
stop_sample(setup_data[TEST_SAMPLE].dat);
play_sample(setup_data[TEST_SAMPLE].dat, 255, 128, 1000, 1);
alert("Playing center channel", NULL, NULL, "Ok", NULL, 0, 0);
stop_sample(setup_data[TEST_SAMPLE].dat);
play_midi(setup_data[TEST_MIDI].dat, 1);
alert("Playing Midi", NULL, NULL, "Ok", NULL, 0, 0);
stop_midi();
return(D_REDRAW);
}
return D_O_K;
}
//Set global variables from allegro variables
void ReadSettings(void)
{
digi_allegro_num = digi_card;
midi_allegro_num = midi_card;
sprintf(flip_stereo, "%d", _flip_pan);
usefm = midi[midi_allegro_num].usefm;
if(usefm)
sprintf(midi_port,"%x", _fm_port);
else
sprintf(midi_port, "%x", _mpu_port);
sprintf(freq, "%d", _sb_freq);
sprintf(base_address, "%x", _sb_port);
sprintf(dma, "%d", _sb_dma);
sprintf(irq, "%d", _sb_irq);
strcpy(digi_name, digi[digi_allegro_num].name);
strcpy(midi_name, midi[midi_allegro_num].name);
if(_flip_pan)
main_dlg[FLIP_POSITION].flags = D_SELECTED;
}
//List to choose new digital card
int DigiListProc(int msg, DIALOG *d, int c)
{
d_list_proc(msg, d, c);
if(msg == MSG_DCLICK)
{
return(D_EXIT);
}
return D_O_K;
}
char *DigiList(int index, int *list_size)
{
if(index < 0)
{
*list_size = NUM_DIGI_CARDS;
return NULL;
}
return(digi[index].name);
}
//Save and exit
int SaveQuitProc(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
WriteSoundCFG();
delete_file("sound.bak");
return(D_EXIT);
}
return D_O_K;
}
//Change midi card
int ChangeMidiCard(int msg, DIALOG *d, int c)
{
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
popup_dialog(midi_list, -1);
strcpy(midi_name, midi[midi_list[0].d1].name);
midi_allegro_num = midi_list[0].d1;
usefm = midi[midi_list[0].d1].usefm;
return(D_REDRAW);
}
return D_O_K;
}
//List to choose new midi card
char *MidiList(int index, int *list_size)
{
if(index < 0)
{
*list_size = NUM_MIDI_CARDS;
return NULL;
}
return(midi[index].name);
}
int MidiListProc(int msg, DIALOG *d, int c)
{
d_list_proc(msg, d, c);
if(msg == MSG_DCLICK)
{
return(D_EXIT);
}
return D_O_K;
}
int ChangeFreq(int msg, DIALOG* d, int c)
{
int list_size;
int ret = d_button_proc(msg, d, c);
if(ret == D_CLOSE)
{
FreqList(-1, &list_size);
if(list_size == 1)
{
alert("Frequency cannot be changed", "for this card!",
NULL, "OK", 0, 0, 0);
return D_REDRAW;
}
popup_dialog(freq_list, -1);
//Copy frequency one char at a time to eliminate comment at end
for(int i=0; i<5; i++)
freq[i] = freqs[freq_list[0].d1].frequency[i];
freq[6] = '\0';
return(D_REDRAW);
}
return D_O_K;
}
char *FreqList(int index, int *list_size)
{
if(index < 0)
{
*list_size = digi[digi_allegro_num].maxfreq + 1;
return NULL;
}
return(freqs[index].frequency);
}
int FreqListProc(int msg, DIALOG *d, int c)
{
d_list_proc(msg, d, c);
if(msg == MSG_DCLICK)
{
return(D_EXIT);
}
return D_O_K;
}
------End-----------
Trey Chandler
evelkomo @iamerica.net
Assumption is the mother of f@*!-ups.
- Raw text -