File:  [RetroPC.NET] / np2 / macosx / Attic / soundopt.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Sun Oct 26 06:28:14 2003 JST (22 years ago) by tk800
Branches: MAIN
CVS tags: HEAD
Add Sound option(unfinished)

/*
 *  soundopt.cpp
 *  np2
 *
 *  Created by tk800 on Sun Oct 26 2003.
 *
 */


#include	"compiler.h"
#include	"np2.h"
#include	"pccore.h"
#include	"sysmng.h"
#include	"iocore.h"
#include	"sound.h"
#include	"fmboard.h"
#include	"dialogutils.h"

#define	getControlValue(a)		GetControl32BitValue(getControlRefByID(a,0,soundWin))
#define	setControlValue(a,b)	SetControl32BitValue(getControlRefByID(a,0,soundWin),b)

#define	kMaxNumTabs 6
enum {kTabMasterSig = 'ScrT',kTabMasterID = 1000,kTabPaneSig= 'ScTb'};

static WindowRef	soundWin;
static UInt16 lastPaneSelected = 1;	// static, to keep track of it long term (in a more complex application
                                        // you might store this in a data structure in the window refCon)                                            


static void setFieldValue(UInt32 type) {
    ControlRef	conRef;
    Str255		title;
    SInt32		value;
    
    value = getControlValue(type); 
    NumToString(value, title);
    conRef = getControlRefByID(type, 1, soundWin);
	SetControlData(conRef, kControlNoPart, kControlStaticTextTextTag, *title, title+1);
    Draw1Control(conRef);
}

static	BYTE			snd26 = 0;
static	BYTE			snd86 = 0;
static	BYTE			spb = 0;
static	BYTE			spbvrc = 0;

static void set26jmp(BYTE value, BYTE bit) {

	if ((snd26 ^ value) & bit) {
		snd26 &= ~bit;
		snd26 |= value;
	}
}

static void initSoundWindow(void) {
    setControlValue('vFM ', np2cfg.vol_fm);
    setFieldValue('vFM ');
    setControlValue('vPSG', np2cfg.vol_ssg);
    setFieldValue('vPSG');
    setControlValue('vADP', np2cfg.vol_adpcm);
    setFieldValue('vADP');
    setControlValue('vPCM', np2cfg.vol_pcm);
    setFieldValue('vPCM');
    setControlValue('vRtm', np2cfg.vol_rhythm);
    setFieldValue('vRtm');
    
    setControlValue('vLft', np2cfg.vol14[0]);
    setFieldValue('vLft');
    setControlValue('vRit', np2cfg.vol14[1]);
    setFieldValue('vRit');
    setControlValue('vf2 ', np2cfg.vol14[2]);
    setFieldValue('vf2 ');
    setControlValue('vf4 ', np2cfg.vol14[3]);
    setFieldValue('vf4 ');
    setControlValue('vf8 ', np2cfg.vol14[4]);
    setFieldValue('vf8 ');
    setControlValue('vf16', np2cfg.vol14[5]);
    setFieldValue('vf16');
    
    snd26 = np2cfg.snd26opt;
    {
        BYTE para;
        static short paranum[4] = {0, 3, 1, 2};
        setControlValue('26io', ((snd26 >> 4) & 1)+1);
        setControlValue('26in', paranum[(snd26 >> 6) & 3]+1);
        para = snd26 & 7;
        if (para > 4) {
            para = 4;
        }
        setControlValue('26rm', para+1);
    }
    snd86 = np2cfg.snd86opt;
    {
        setControlValue('86io', ((~snd86) & 1)+1);
        static short paranum[4] = {0, 1, 3, 2};
        setControlValue('86in', paranum[(snd86 >> 2) & 3]+1);
        setControlValue('86id', (((~snd86) >> 5) & 7)+1);
        SetControl32BitValue(getControlRefByID('86in',1,soundWin),(snd86 & 0x10)?1:0);
        SetControl32BitValue(getControlRefByID('86rm',1,soundWin),(snd86 & 0x02)?1:0);
   }
    spb = np2cfg.spbopt;
    {
        BYTE para;
        static short paranum[4] = {0, 3, 1, 2};
        setControlValue('spio', ((spb >> 4) & 1)+1);
        setControlValue('spin', paranum[(spb >> 6) & 3]+1);
        para = spb & 7;
        if (para > 4) {
            para = 4;
        }
        setControlValue('sprm', para+1);
        
        spbvrc = np2cfg.spb_vrc;								// ver0.30
        setControlValue('spvl',(spbvrc & 1)?1:0);
        setControlValue('spvr',(spbvrc & 2)?1:0);
        setControlValue('splv',np2cfg.spb_vrl);
        setControlValue('sprv',np2cfg.spb_x);
    }
    spbvrc = np2cfg.spb_vrc;								// ver0.30

    
}


static pascal OSStatus cfWinproc(EventHandlerCallRef myHandler, EventRef event, void* userData) {
    OSStatus	err = eventNotHandledErr;
    HICommand	cmd;
    SINT32	val;
	UInt8	value[6];
	UInt8	b;
	UInt8	update;
	int		renewal;

    if (GetEventClass(event)==kEventClassCommand && GetEventKind(event)==kEventCommandProcess ) {
        GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd);
        switch (cmd.commandID)
        {
            case 'vFM ':
            case 'vPSG':
            case 'vADP':
            case 'vPCM':
            case 'vRtm':
            case 'vLft':
            case 'vRit':
            case 'vf2 ':
            case 'vf4 ':
            case 'vf8 ':
            case 'vf16':
                setFieldValue(cmd.commandID);
                break;

            case '26io':
                set26jmp(getControlValue('26io'), 0x10);
                break;

            case kHICommandOK:
                renewal = 0;
                val = getControlValue('vFM ');
                if (val != np2cfg.vol_fm) {
                    np2cfg.vol_fm = val;
                    renewal = 1;
                }
                val = getControlValue('vPSG');
                if (val != np2cfg.vol_ssg) {
                    np2cfg.vol_ssg = val;
                    renewal = 1;
                }
                val = getControlValue('vADP');
                if (val != np2cfg.vol_adpcm) {
                    np2cfg.vol_adpcm = val;
                    renewal = 1;
                }
                val = getControlValue('vPCM');
                if (val != np2cfg.vol_pcm) {
                    np2cfg.vol_pcm = val;
                    renewal = 1;
                }
                val = getControlValue('vRtm');
                if (val != np2cfg.vol_rhythm) {
                    np2cfg.vol_rhythm = val;
                    renewal = 1;
                }
                if (renewal) {
                    sysmng_update(SYS_UPDATECFG);
                }
				opngen_setvol(np2cfg.vol_fm);
				psggen_setvol(np2cfg.vol_ssg);
				rhythm_setvol(np2cfg.vol_rhythm);
				rhythm_update(&rhythm);
				adpcm_setvol(np2cfg.vol_adpcm);
				adpcm_update(&adpcm);
				pcm86gen_setvol(np2cfg.vol_pcm);
				pcm86gen_update();
                
                renewal = 0;
                val = getControlValue('vLft');
                if (val != np2cfg.vol14[0]) {
                    np2cfg.vol14[0] = val;
                    renewal = 1;
                }
                val = getControlValue('vRit');
                if (val != np2cfg.vol14[1]) {
                    np2cfg.vol14[1] = val;
                    renewal = 1;
                }
                val = getControlValue('vf2 ');
                if (val != np2cfg.vol14[2]) {
                    np2cfg.vol14[2] = val;
                    renewal = 1;
                }
                val = getControlValue('vf4 ');
                if (val != np2cfg.vol14[3]) {
                    np2cfg.vol14[3] = val;
                    renewal = 1;
                }
                val = getControlValue('vf8 ');
                if (val != np2cfg.vol14[4]) {
                    np2cfg.vol14[4] = val;
                    renewal = 1;
                }
                val = getControlValue('vf16');
                if (val != np2cfg.vol14[5]) {
                    np2cfg.vol14[5] = val;
                    renewal = 1;
                }
                if (renewal) {
                    sysmng_update(SYS_UPDATECFG);
                    tms3631_setvol(np2cfg.vol14);
                }

				if (np2cfg.snd26opt != snd26) {
					np2cfg.snd26opt = snd26;
					sysmng_update(SYS_UPDATECFG);
				}
				if (np2cfg.snd86opt != snd86) {
					np2cfg.snd86opt = snd86;
					sysmng_update(SYS_UPDATECFG);
				}
                
				update = 0;
				if (np2cfg.spbopt != spb) {
					np2cfg.spbopt = spb;
					update |= SYS_UPDATECFG;
				}
				if (np2cfg.spb_vrc != spbvrc) {
					np2cfg.spb_vrc = spbvrc;
					update |= SYS_UPDATECFG;
				}
				val = getControlValue('spvl');
				if (np2cfg.spb_vrl != val) {
					np2cfg.spb_vrl = val;
					update |= SYS_UPDATECFG;
				}
				opngen_setVR(np2cfg.spb_vrc, np2cfg.spb_vrl);
				val = getControlValue('sprv');
				if (np2cfg.spb_x != val) {
					np2cfg.spb_x = val;
					update |= SYS_UPDATECFG;
				}
				sysmng_update(update);
                
                endLoop(soundWin);
                err=noErr;
                break;
                
            case kHICommandCancel:
                endLoop(soundWin);
                err=noErr;
                break;
        }
    }

	(void)myHandler;
	(void)userData;
    return err;
}

static pascal OSStatus PrefsTabEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
{
    WindowRef theWindow = (WindowRef)inUserData;  // get the windowRef, passed around as userData    
    short ret;
    ret = changeTab(theWindow, lastPaneSelected);
    if (ret) {
        lastPaneSelected = ret;
    }
    return( eventNotHandledErr );
}

static void makeNibWindow (IBNibRef nibRef) {
    OSStatus	err;
    
    err = CreateWindowFromNib(nibRef, CFSTR("SoundDialog"), &soundWin);
    if (err == noErr) {
        initSoundWindow();
        SetInitialTabState(soundWin, lastPaneSelected, kMaxNumTabs);
        EventTypeSpec	tabControlEvents[] ={ { kEventClassControl, kEventControlHit }};
        InstallControlEventHandler( getControlRefByID(kTabMasterSig,kTabMasterID,soundWin),  PrefsTabEventHandlerProc , GetEventTypeCount(tabControlEvents), tabControlEvents, soundWin, NULL );
        EventTypeSpec	list[]={ { kEventClassCommand, kEventCommandProcess },};
        EventHandlerRef	ref;
        InstallWindowEventHandler (soundWin, NewEventHandlerUPP(cfWinproc), GetEventTypeCount(list), list, (void *)soundWin, &ref);
        ShowSheetWindow(soundWin, hWndMain);
        
        err=RunAppModalLoopForWindow(soundWin);
    }
    return;
}

void initSoundOpt( void ) {
    OSStatus	err;
    IBNibRef	nibRef;

    err = CreateNibReference(CFSTR("np2"), &nibRef);
    if (err ==noErr ) {
        makeNibWindow (nibRef);
        DisposeNibReference ( nibRef);
    }
    else {
         return;
    }
}


RetroPC.NET-CVS <cvs@retropc.net>