File:  [RetroPC.NET] / np2 / macosx / Attic / configure.cpp
Revision 1.3: download - view: text, annotated - select for diffs
Fri Oct 24 06:00:24 2003 JST (22 years ago) by tk800
Branches: MAIN
CVS tags: HEAD
Add screen option

/*
 *  configure.cpp
 *  from Neko Project IIx 0.3
 *
 *  Created by tk800 on Mon Sep 23 2002.
 *
 */

#include	"compiler.h"
#include	"np2.h"
#include	"pccore.h"
#include	"ini.h"
#include	"sysmng.h"
#include	"configure.h"

        int			sound_renewals = 0;
static	WindowRef	configWin;

#define	AVE(a, b)					\
			(((a) + (b)) / 2)

static void endLoop(void) {
    OSStatus	err;
    HideSheetWindow(configWin);
    DisposeWindow(configWin);
    err=QuitAppModalLoopForWindow(configWin);
}

ControlRef getControlRefByID(OSType sign, int id, WindowRef win) {
    ControlRef	conRef;
    ControlID	conID;

    conID.signature=sign;
    conID.id=id;
    GetControlByID(win, &conID, &conRef);
    return conRef;
}    

static SInt16 getSelectedValue(OSType sign, int id) {
    SInt16	value;
    
    value=GetControlValue(getControlRefByID(sign, id, configWin));

    return value;
}

static int getMultiple(void) {
    int multi;
    switch (getSelectedValue('Mltp', 5))
    {
        case 1:
            multi=1;
            break;
        case 2:
            multi=2;
            break;
        case 3:
            multi=4;
            break;
        case 4:
            multi=5;
            break;
        case 5:
            multi=6;
            break;
        case 6:
            multi=8;
            break;
        case 7:
            multi=10;
            break;
        case 8:
            multi=12;
            break;
        case 9:
            multi=16;
            break;
        case 10:
            multi=20;
            break;
        default:
            multi=4;
            break;
    }
    return multi;
}

static void setCPUClock(void) {
    unsigned int	base, clock;
    ControlRef	conRef;
    char	outstr[1024+64+2];
    int	length;

    if (getSelectedValue('CPU ', 3)==1) {
        base=24576;
    }
    else {
        base=19968;
    }
    clock = base * getMultiple();
    conRef=getControlRefByID('CKtx', 6, configWin);
    
    sprintf(outstr, " %2u.%04u", clock / 10000, clock % 10000);
    length=strlen(outstr);
    SetControlData(conRef,kControlNoPart,kControlStaticTextTextTag,length,outstr);
}

static void initConfigWindow(void) {
        SInt16	i;
        Str255	title;
    
        if (np2cfg.baseclock >= AVE(PCBASECLOCK25, PCBASECLOCK20)) {
            i=1;
        }
        else {
            i=2;
        }
        SetControlValue(getControlRefByID('CPU ', 3, configWin), i);

        switch (np2cfg.multiple)
        {
            case 1:
                i=1;
                break;
            case 2:
                i=2;
                break;
            case 4:
                i=3;
                break;
            case 5:
                i=4;
                break;
            case 6:
                i=5;
                break;
            case 8:
                i=6;
                break;
            case 10:
                i=7;
                break;
            case 12:
                i=8;
                break;
            case 16:
                i=9;
                break;
            case 20:
                i=10;
                break;
            default:
                i=4;
                break;
        }
        SetControlValue(getControlRefByID('Mltp', 5, configWin), i);
        setCPUClock();
        NumToString(np2cfg.delayms, title);
        if (np2cfg.samplingrate < AVE(11025, 22050)) {
            i=1;
        }
        else if (np2cfg.samplingrate < AVE(22050, 44100)) {
            i=2;
        }
        else {
            i=3;
        }
        SetControlValue(getControlRefByID('Rate', 8, configWin), i);
        NumToString(np2cfg.delayms, title);
        SetControlData(getControlRefByID('Bufr', 7, configWin), kControlNoPart, kControlStaticTextTextTag, *title, title+1);

        SetControlValue(getControlRefByID('cnfm', 0, configWin), np2oscfg.comfirm);
        SetControlValue(getControlRefByID('rsum', 0, configWin), np2oscfg.resume);
}

static pascal OSStatus cfWinproc(EventHandlerCallRef myHandler, EventRef event, void* userData) {
    OSStatus	err = eventNotHandledErr;
    HICommand	cmd;
    UINT32	dval;
    UINT16	wval;
	UINT	update;

    if (GetEventClass(event)==kEventClassCommand && GetEventKind(event)==kEventCommandProcess ) {
        GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd);
        switch (cmd.commandID)
        {
            case 'base':
                setCPUClock();
                break;

            case 'mult':
                setCPUClock();
                break;

            case kHICommandOK:
                update = 0;
                if (getSelectedValue('CPU ', 3)!=1) {
                    dval=PCBASECLOCK20;
                }
                else {
                    dval=PCBASECLOCK25;
                }
                if (dval != np2cfg.baseclock) {
                    np2cfg.baseclock = dval;
                    update |= SYS_UPDATECFG | SYS_UPDATECLOCK;
                }
                dval=getMultiple();
                if (dval != np2cfg.multiple) {
                    np2cfg.multiple = dval;
                    update |= SYS_UPDATECFG | SYS_UPDATECLOCK;
                }
                
                dval=getSelectedValue('Rate', 8);
                if (dval==1) {
                    wval = 11025;
                }
                else if (dval==2) {
                    wval = 22050;
                }
                else {
                    wval = 44100;
                }
                if (wval != np2cfg.samplingrate) {
                    np2cfg.samplingrate = wval;
                    update |= SYS_UPDATECFG | SYS_UPDATERATE;
                    soundrenewal = 1;
                }
                

                {
                    Size	size, outSize;
                    ControlRef	cRef;
                    char	buffer[255];
                    char*	pt;
                    char*	retPtr;

                    pt=&buffer[0];
                    cRef=getControlRefByID('Bufr', 7, configWin);
                    GetControlDataSize(cRef, kControlNoPart, kControlStaticTextTextTag, &size);
                    GetControlData(cRef, kControlNoPart, kControlStaticTextTextTag, size, pt, &outSize);
                    *(pt+outSize)=NULL;
                    dval=strtoul(pt, &retPtr, 10);
					if (dval < 100) {
						dval = 100;
					}
					else if (dval > 1000) {
						dval = 1000;
					}
                    if (dval!= np2cfg.delayms) {
						soundrenewal = 1;
						np2cfg.delayms = dval;
						update |= SYS_UPDATECFG | SYS_UPDATESBUF;
                    }
                }
                dval=getSelectedValue('cnfm', 0);
                if (dval != np2oscfg.comfirm) {
                    np2oscfg.comfirm = dval;
                    update |= SYS_UPDATEOSCFG;
                }
                dval=getSelectedValue('rsum', 0);
                if (dval != np2oscfg.resume) {
                    np2oscfg.resume = dval;
                    update |= SYS_UPDATEOSCFG;
                }

                sysmng_update(update);
                endLoop();
                err=noErr;
                break;
                
            case kHICommandCancel:
                endLoop();
                err=noErr;
                break;
        }
    }

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


static void makeNibWindow (IBNibRef nibRef) {
    OSStatus	err;
    
    err = CreateWindowFromNib(nibRef, CFSTR("ConfigDialog"), &configWin);
    if (err == noErr) {
        initConfigWindow();
        EventTypeSpec	list[]={ { kEventClassCommand, kEventCommandProcess },
        { kEventClassWindow, kEventWindowActivated } };
        EventHandlerRef	ref;
        
        InstallWindowEventHandler (configWin, NewEventHandlerUPP(cfWinproc), 2, list, (void *)configWin, &ref);
        ShowSheetWindow(configWin, hWndMain);
        
        err=RunAppModalLoopForWindow(configWin);
    }
    return;
}

void initConfig( 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>