Cocoa Port: Do some refactoring on reading the client-side inputs.

- Also make calculating the mic level average more efficient, as well
as updating the mic level average every 8th frame instead of every
frame.
This commit is contained in:
rogerman 2017-09-01 00:33:54 -07:00
parent b4650e4083
commit a86539eb1c
9 changed files with 400 additions and 209 deletions

View File

@ -32,14 +32,17 @@ public:
virtual void connect()
{
guitarKeyStatus = 0;
guitarKeyStatus = 0xFF;
}
virtual u8 readByte(u8 PROCNUM, u32 addr)
{
if (addr == 0x0A000000) return (~guitarKeyStatus);
return (addr & 1)?0xF9:0xFF;
if (addr == 0x0A000000)
return guitarKeyStatus;
return (addr & 1) ? 0xF9 : 0xFF;
}
virtual u16 readWord(u8 PROCNUM, u32 addr) { return 0xF9FF; }
virtual u32 readLong(u8 PROCNUM, u32 addr) { return 0xF9FFF9FF; }
};
@ -48,5 +51,15 @@ ISlot2Interface* construct_Slot2_GuitarGrip() { return new Slot2_GuitarGrip(); }
void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue)
{
guitarKeyStatus = 0 | (green << 6) | (red << 5) | (yellow << 4) | (blue << 3);
const u8 g = (green) ? (1 << 6) : 0;
const u8 r = (red) ? (1 << 5) : 0;
const u8 y = (yellow) ? (1 << 4) : 0;
const u8 b = (blue) ? (1 << 3) : 0;
guitarKeyStatus = ~(g | r | y | b);
}
void guitarGrip_setKey(u8 theKeys)
{
guitarKeyStatus = theKeys;
}

View File

@ -17,7 +17,7 @@
#include "../slot2.h"
static u16 pianoKeyStatus = 0;
static u16 pianoKeyStatus = 0;
class Slot2_EasyPiano : public ISlot2Interface
{
@ -30,7 +30,7 @@ public:
virtual void connect()
{
pianoKeyStatus = 0;
pianoKeyStatus = 0xE7FF;
}
virtual u8 readByte(u8 PROCNUM, u32 addr)
@ -61,10 +61,10 @@ public:
//LOG("PIANO: %04X\n",pianoKeyStatus);
if(addr == 0x09FFFFFE) return (~(pianoKeyStatus&0xFF));
if(addr == 0x09FFFFFF) return (~((pianoKeyStatus>>8)&0xFF))&~(0x18);
if (addr == 0x09FFFFFE) return ((pianoKeyStatus >> 0) & 0xFF);
if (addr == 0x09FFFFFF) return ((pianoKeyStatus >> 8) & 0xFF) & ~(0x18);
return (addr & 1)?0xE7:0xFF;
return (addr & 1) ? 0xE7 : 0xFF;
}
virtual u16 readWord(u8 PROCNUM, u32 addr)
{
@ -99,7 +99,7 @@ void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, boo
//0x09FFFFFF:7 = ?
#define BIT_P(N,v) ((v)?(1<<(N)):0)
pianoKeyStatus =
pianoKeyStatus = ~(
BIT_P(0,c) |
BIT_P(1,cs) |
BIT_P(2,d) |
@ -113,5 +113,10 @@ void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, boo
BIT_P(10,as) |
BIT_P(13,b) |
BIT_P(14,hic)
;
);
}
void piano_setKey(u16 theKeys)
{
pianoKeyStatus = theKeys;
}

View File

@ -849,7 +849,30 @@ void ClientExecutionControl::FetchOutputPostNDSExec()
rtcGetTimeAsString(tempBuffer);
this->_ndsFrameInfo.rtcString = tempBuffer;
free(tempBuffer);
const UserInput &ndsInput = NDS_getFinalUserInput();
this->_ndsFrameInfo.inputState.value = 0xFFFFFFFFFFFFFFFFUL;
this->_ndsFrameInfo.inputState.A = (ndsInput.buttons.A) ? 0 : 1;
this->_ndsFrameInfo.inputState.B = (ndsInput.buttons.B) ? 0 : 1;
this->_ndsFrameInfo.inputState.Select = (ndsInput.buttons.T) ? 0 : 1;
this->_ndsFrameInfo.inputState.Start = (ndsInput.buttons.S) ? 0 : 1;
this->_ndsFrameInfo.inputState.Right = (ndsInput.buttons.R) ? 0 : 1;
this->_ndsFrameInfo.inputState.Left = (ndsInput.buttons.L) ? 0 : 1;
this->_ndsFrameInfo.inputState.Up = (ndsInput.buttons.U) ? 0 : 1;
this->_ndsFrameInfo.inputState.Down = (ndsInput.buttons.D) ? 0 : 1;
this->_ndsFrameInfo.inputState.R = (ndsInput.buttons.E) ? 0 : 1;
this->_ndsFrameInfo.inputState.L = (ndsInput.buttons.W) ? 0 : 1;
this->_ndsFrameInfo.inputState.X = (ndsInput.buttons.X) ? 0 : 1;
this->_ndsFrameInfo.inputState.Y = (ndsInput.buttons.Y) ? 0 : 1;
this->_ndsFrameInfo.inputState.Debug = (ndsInput.buttons.G) ? 0 : 1;
this->_ndsFrameInfo.inputState.Touch = (ndsInput.touch.isTouch) ? 0 : 1;
this->_ndsFrameInfo.inputState.Lid = (ndsInput.buttons.F) ? 0 : 1;
this->_ndsFrameInfo.inputState.Microphone = (ndsInput.mic.micButtonPressed != 0) ? 0 : 1;
this->_ndsFrameInfo.touchLocX = ndsInput.touch.touchX;
this->_ndsFrameInfo.touchLocY = ndsInput.touch.touchY;
pthread_mutex_unlock(&this->_mutexOutputPostNDSExec);
}

View File

@ -60,7 +60,174 @@ enum CPUEmulationEngineID
CPUEmulationEngineID_DynamicRecompiler = 1
};
typedef struct ClientExecutionControlSettings
enum NDSInputID
{
NDSInputID_A = 0,
NDSInputID_B,
NDSInputID_Select,
NDSInputID_Start,
NDSInputID_Right,
NDSInputID_Left,
NDSInputID_Up,
NDSInputID_Down,
NDSInputID_R,
NDSInputID_L,
NDSInputID_X,
NDSInputID_Y,
NDSInputID_Debug,
NDSInputID_Touch,
NDSInputID_Lid,
NDSInputID_Microphone,
NDSInputID_GuitarGrip_Green,
NDSInputID_GuitarGrip_Red,
NDSInputID_GuitarGrip_Yellow,
NDSInputID_GuitarGrip_Blue,
NDSInputID_Piano_C,
NDSInputID_Piano_CSharp,
NDSInputID_Piano_D,
NDSInputID_Piano_DSharp,
NDSInputID_Piano_E,
NDSInputID_Piano_F,
NDSInputID_Piano_FSharp,
NDSInputID_Piano_G,
NDSInputID_Piano_GSharp,
NDSInputID_Piano_A,
NDSInputID_Piano_ASharp,
NDSInputID_Piano_B,
NDSInputID_Piano_HighC,
NDSInputID_Paddle,
NDSInputID_InputCount
};
typedef union
{
uint64_t value;
struct
{
uint16_t gbaKeys;
uint8_t ndsKeysExt;
uint8_t guitarGripKeys;
uint16_t easyPianoKeys;
uint8_t miscKeys;
uint8_t unused;
};
struct
{
#ifndef MSB_FIRST
uint8_t A:1;
uint8_t B:1;
uint8_t Select:1;
uint8_t Start:1;
uint8_t Right:1;
uint8_t Left:1;
uint8_t Up:1;
uint8_t Down:1;
uint8_t R:1;
uint8_t L:1;
uint8_t :6;
uint8_t X:1;
uint8_t Y:1;
uint8_t :1;
uint8_t Debug:1;
uint8_t :2;
uint8_t Touch:1;
uint8_t Lid:1;
uint8_t :3;
uint8_t GuitarGripBlue:1;
uint8_t GuitarGripYellow:1;
uint8_t GuitarGripRed:1;
uint8_t GuitarGripGreen:1;
uint8_t :1;
uint8_t PianoC:1;
uint8_t PianoCSharp:1;
uint8_t PianoD:1;
uint8_t PianoDSharp:1;
uint8_t PianoE:1;
uint8_t PianoF:1;
uint8_t PianoFSharp:1;
uint8_t PianoG:1;
uint8_t PianoGSharp:1;
uint8_t PianoA:1;
uint8_t PianoASharp:1;
uint8_t :2;
uint8_t PianoB:1;
uint8_t PianoHighC:1;
uint8_t :1;
uint8_t Paddle:1;
uint8_t Microphone:1;
uint8_t :6;
uint8_t :8;
#else
uint8_t Down:1;
uint8_t Up:1;
uint8_t Left:1;
uint8_t Right:1;
uint8_t Start:1;
uint8_t Select:1;
uint8_t B:1;
uint8_t A:1;
uint8_t :6
uint8_t L:1;
uint8_t R:1;
uint8_t Lid:1;
uint8_t Touch:1;
uint8_t :2;
uint8_t Debug:1;
uint8_t :1;
uint8_t Y:1;
uint8_t X:1;
uint8_t :1;
uint8_t GuitarGripGreen:1;
uint8_t GuitarGripRed:1;
uint8_t GuitarGripYellow:1;
uint8_t GuitarGripBlue:1;
uint8_t :3;
uint8_t PianoG:1;
uint8_t PianoFSharp:1;
uint8_t PianoF:1;
uint8_t PianoE:1;
uint8_t PianoDSharp:1;
uint8_t PianoD:1;
uint8_t PianoCSharp:1;
uint8_t PianoC:1;
uint8_t :1;
uint8_t PianoHighC:1;
uint8_t PianoB:1;
uint8_t :2;
uint8_t PianoASharp:1;
uint8_t PianoA:1;
uint8_t PianoGSharp:1;
uint8_t :6;
uint8_t Microphone:1;
uint8_t Paddle:1;
uint8_t :8;
#endif
};
} NDSInputState; // Each bit represents the Pressed/Released state of a single input. Pressed=0, Released=1
struct ClientExecutionControlSettings
{
CPUEmulationEngineID cpuEngineID;
uint8_t JITMaxBlockSize;
@ -94,8 +261,7 @@ typedef struct ClientExecutionControlSettings
ExecutionBehavior execBehavior;
FrameJumpBehavior jumpBehavior;
} ClientExecutionControlSettings;
};
struct NDSFrameInfo
{
@ -109,6 +275,10 @@ struct NDSFrameInfo
uint32_t cpuLoadAvgARM9;
uint32_t cpuLoadAvgARM7;
NDSInputState inputState;
uint16_t touchLocX;
uint16_t touchLocY;
void clear()
{
this->cpuEmulationEngineName = std::string();
@ -119,6 +289,9 @@ struct NDSFrameInfo
this->lagFrameCount = 0;
this->cpuLoadAvgARM9 = 0;
this->cpuLoadAvgARM7 = 0;
this->inputState.value = 0xFFFFFFFFFFFFFFFFUL;
this->touchLocX = 0;
this->touchLocY = 0;
}
void copyFrom(const NDSFrameInfo &fromObject)
@ -131,6 +304,9 @@ struct NDSFrameInfo
this->lagFrameCount = fromObject.lagFrameCount;
this->cpuLoadAvgARM9 = fromObject.cpuLoadAvgARM9;
this->cpuLoadAvgARM7 = fromObject.cpuLoadAvgARM7;
this->inputState = fromObject.inputState;
this->touchLocX = fromObject.touchLocX;
this->touchLocY = fromObject.touchLocY;
}
};

View File

@ -1004,10 +1004,13 @@ static void* RunCoreThread(void *arg)
continue;
}
// Make sure that the mic level is updated at least once per frame, regardless
// Make sure that the mic level is updated at least once every 8 frames, regardless
// of whether the NDS actually reads the mic or not.
[cdsController updateMicLevel];
[cdsController clearMicLevelMeasure];
if ((ndsFrameInfo.frameIndex & 0x07) == 0x07)
{
[cdsController updateMicLevel];
[cdsController clearMicLevelMeasure];
}
const uint8_t framesToSkip = execControl->GetFramesToSkip();

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012-2015 DeSmuME Team
Copyright (C) 2012-2017 DeSmuME Team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -20,61 +20,22 @@
#include <libkern/OSAtomic.h>
#include <vector>
#include "ClientExecutionControl.h"
@class CocoaDSController;
class CoreAudioInput;
struct CoreAudioInputDeviceInfo;
class AudioGenerator;
class AudioSampleBlockGenerator;
enum
{
DSControllerState_Right = 0,
DSControllerState_Left,
DSControllerState_Down,
DSControllerState_Up,
DSControllerState_Select,
DSControllerState_Start,
DSControllerState_B,
DSControllerState_A,
DSControllerState_Y,
DSControllerState_X,
DSControllerState_L,
DSControllerState_R,
DSControllerState_Debug,
DSControllerState_Lid,
DSControllerState_Touch,
DSControllerState_Microphone,
DSControllerState_GuitarGrip_Green,
DSControllerState_GuitarGrip_Red,
DSControllerState_GuitarGrip_Yellow,
DSControllerState_GuitarGrip_Blue,
DSControllerState_Piano_C,
DSControllerState_Piano_CSharp,
DSControllerState_Piano_D,
DSControllerState_Piano_DSharp,
DSControllerState_Piano_E,
DSControllerState_Piano_F,
DSControllerState_Piano_FSharp,
DSControllerState_Piano_G,
DSControllerState_Piano_GSharp,
DSControllerState_Piano_A,
DSControllerState_Piano_ASharp,
DSControllerState_Piano_B,
DSControllerState_Piano_HighC,
DSControllerState_Paddle,
DSControllerState_StatesCount
};
typedef struct
{
bool state;
bool isPressed;
bool turbo;
bool autohold;
uint16_t turboPattern;
} NDSInput;
uint32_t turboPattern;
uint8_t turboPatternStep;
} ClientInput;
@protocol CocoaDSControllerDelegate <NSObject>
@ -92,7 +53,7 @@ typedef struct
{
id <CocoaDSControllerDelegate> delegate;
NDSInput ndsInput[DSControllerState_StatesCount];
ClientInput clientInput[NDSInputID_InputCount];
BOOL autohold;
BOOL _isAutoholdCleared;
@ -101,10 +62,12 @@ typedef struct
NSInteger stylusPressure;
float micLevel;
float _micLevelTotal;
float _micLevelsRead;
BOOL hardwareMicMute;
BOOL _useHardwareMic;
size_t _availableMicSamples;
std::vector<uint8_t> *_hwMicLevelList;
NSInteger micMode;
AudioSampleBlockGenerator *selectedAudioFileGenerator;
@ -144,7 +107,7 @@ typedef struct
@property (retain) NSString *hardwareMicSampleRateString;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled;
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled turboPattern:(uint32_t)turboPattern;
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation;
- (void) setSineWaveGeneratorFrequency:(const double)freq;
- (void) clearAutohold;

View File

@ -1,6 +1,6 @@
/*
Copyright (C) 2011 Roger Manuel
Copyright (C) 2012-2016 DeSmuME team
Copyright (C) 2012-2017 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -66,12 +66,13 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
return self;
}
for (size_t i = 0; i < DSControllerState_StatesCount; i++)
for (size_t i = 0; i < NDSInputID_InputCount; i++)
{
ndsInput[i].state = false;
ndsInput[i].turbo = false;
ndsInput[i].turboPattern = false;
ndsInput[i].autohold = false;
clientInput[i].isPressed = false;
clientInput[i].turbo = false;
clientInput[i].turboPattern = 0;
clientInput[i].turboPatternStep = 0;
clientInput[i].autohold = false;
}
delegate = nil;
@ -81,10 +82,9 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
_useHardwareMic = NO;
_availableMicSamples = 0;
_hwMicLevelList = new std::vector<uint8_t>;
_hwMicLevelList->reserve(1024);
_hwMicLevelList->clear();
micLevel = 0.0f;
_micLevelTotal = 0.0f;
_micLevelsRead = 0.0f;
micMode = MICMODE_NONE;
selectedAudioFileGenerator = NULL;
@ -109,7 +109,6 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
- (void)dealloc
{
delete CAInputDevice;
delete _hwMicLevelList;
[self setDelegate:nil];
[self setHardwareMicInfoString:nil];
@ -183,14 +182,14 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
- (void) setSoftwareMicState:(BOOL)theState
{
OSSpinLockLock(&spinlockControllerState);
ndsInput[DSControllerState_Microphone].state = (theState) ? true : false;
clientInput[NDSInputID_Microphone].isPressed = (theState) ? true : false;
OSSpinLockUnlock(&spinlockControllerState);
}
- (BOOL) softwareMicState
{
OSSpinLockLock(&spinlockControllerState);
BOOL theState = (ndsInput[DSControllerState_Microphone].state) ? YES : NO;
BOOL theState = (clientInput[NDSInputID_Microphone].isPressed) ? YES : NO;
OSSpinLockUnlock(&spinlockControllerState);
return theState;
}
@ -218,15 +217,15 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
if (autohold && _isAutoholdCleared)
{
memset(ndsInput, 0, sizeof(ndsInput));
memset(clientInput, 0, sizeof(clientInput));
_isAutoholdCleared = NO;
}
if (!autohold)
{
for (size_t i = 0; i < DSControllerState_StatesCount; i++)
for (size_t i = 0; i < NDSInputID_InputCount; i++)
{
ndsInput[i].state = ndsInput[i].autohold;
clientInput[i].isPressed = clientInput[i].autohold;
}
}
@ -243,12 +242,12 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID
{
[self setControllerState:theState controlID:controlID turbo:NO];
[self setControllerState:theState controlID:controlID turbo:NO turboPattern:0];
}
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled
- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID turbo:(const BOOL)isTurboEnabled turboPattern:(uint32_t)turboPattern
{
if (controlID >= DSControllerState_StatesCount)
if (controlID >= NDSInputID_InputCount)
{
return;
}
@ -259,16 +258,26 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
{
if (theState)
{
ndsInput[controlID].turbo = (isTurboEnabled) ? true : false;
ndsInput[controlID].turboPattern = (ndsInput[controlID].turbo) ? 0x5555 : 0;
ndsInput[controlID].autohold = true;
clientInput[controlID].turbo = (isTurboEnabled) ? true : false;
clientInput[controlID].turboPattern = (clientInput[controlID].turbo) ? turboPattern : 0;
clientInput[controlID].autohold = true;
if (!clientInput[controlID].turbo)
{
clientInput[controlID].turboPatternStep = 0;
}
}
}
else
{
ndsInput[controlID].state = (theState || ndsInput[controlID].autohold);
ndsInput[controlID].turbo = (isTurboEnabled && ndsInput[controlID].state);
ndsInput[controlID].turboPattern = (ndsInput[controlID].turbo) ? 0x5555 : 0;
clientInput[controlID].isPressed = (theState || clientInput[controlID].autohold);
clientInput[controlID].turbo = (isTurboEnabled && clientInput[controlID].isPressed);
clientInput[controlID].turboPattern = (clientInput[controlID].turbo) ? turboPattern : 0;
if (!clientInput[controlID].turbo)
{
clientInput[controlID].turboPatternStep = 0;
}
}
OSSpinLockUnlock(&spinlockControllerState);
@ -277,7 +286,7 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation
{
OSSpinLockLock(&spinlockControllerState);
ndsInput[DSControllerState_Touch].state = (theState) ? true : false;
clientInput[NDSInputID_Touch].isPressed = (theState) ? true : false;
touchLocation = theLocation;
OSSpinLockUnlock(&spinlockControllerState);
}
@ -294,7 +303,7 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
if (!_isAutoholdCleared)
{
memset(ndsInput, 0, sizeof(ndsInput));
memset(clientInput, 0, sizeof(clientInput));
_isAutoholdCleared = YES;
}
@ -307,48 +316,52 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
const NSPoint theLocation = touchLocation;
const NSInteger theMicMode = micMode;
static bool flushedStates[DSControllerState_StatesCount] = {0};
bool flushedStates[NDSInputID_InputCount] = {0};
if (!autohold)
{
for (size_t i = 0; i < DSControllerState_StatesCount; i++)
for (size_t i = 0; i < NDSInputID_InputCount; i++)
{
flushedStates[i] = (ndsInput[i].state || ndsInput[i].autohold);
flushedStates[i] = (clientInput[i].isPressed || clientInput[i].autohold);
if (ndsInput[i].turbo)
if (clientInput[i].turbo)
{
const bool turboState = ndsInput[i].turboPattern & 0x0001;
const bool turboState = (clientInput[i].turboPattern >> clientInput[i].turboPatternStep) & 0x00000001;
flushedStates[i] = (flushedStates[i] && turboState);
ndsInput[i].turboPattern >>= 1;
ndsInput[i].turboPattern |= (turboState) ? 0x8000 : 0x0000;
clientInput[i].turboPatternStep++;
if (clientInput[i].turboPatternStep >= 32)
{
clientInput[i].turboPatternStep = 0;
}
}
else
{
flushedStates[i] = ndsInput[i].state;
flushedStates[i] = clientInput[i].isPressed;
}
}
}
OSSpinLockUnlock(&spinlockControllerState);
const bool isTouchDown = flushedStates[DSControllerState_Touch];
const bool isMicPressed = flushedStates[DSControllerState_Microphone];
const bool isTouchDown = flushedStates[NDSInputID_Touch];
const bool isMicPressed = flushedStates[NDSInputID_Microphone];
// Setup the DS pad.
NDS_setPad(flushedStates[DSControllerState_Right],
flushedStates[DSControllerState_Left],
flushedStates[DSControllerState_Down],
flushedStates[DSControllerState_Up],
flushedStates[DSControllerState_Select],
flushedStates[DSControllerState_Start],
flushedStates[DSControllerState_B],
flushedStates[DSControllerState_A],
flushedStates[DSControllerState_Y],
flushedStates[DSControllerState_X],
flushedStates[DSControllerState_L],
flushedStates[DSControllerState_R],
flushedStates[DSControllerState_Debug],
flushedStates[DSControllerState_Lid]);
NDS_setPad(flushedStates[NDSInputID_Right],
flushedStates[NDSInputID_Left],
flushedStates[NDSInputID_Down],
flushedStates[NDSInputID_Up],
flushedStates[NDSInputID_Select],
flushedStates[NDSInputID_Start],
flushedStates[NDSInputID_B],
flushedStates[NDSInputID_A],
flushedStates[NDSInputID_Y],
flushedStates[NDSInputID_X],
flushedStates[NDSInputID_L],
flushedStates[NDSInputID_R],
flushedStates[NDSInputID_Debug],
flushedStates[NDSInputID_Lid]);
// Setup the DS touch pad.
CommonSettings.StylusPressure = (int)[self stylusPressure];
@ -367,26 +380,26 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
switch (slot2DeviceType)
{
case NDS_SLOT2_GUITARGRIP:
guitarGrip_setKey(flushedStates[DSControllerState_GuitarGrip_Green],
flushedStates[DSControllerState_GuitarGrip_Red],
flushedStates[DSControllerState_GuitarGrip_Yellow],
flushedStates[DSControllerState_GuitarGrip_Blue]);
guitarGrip_setKey(flushedStates[NDSInputID_GuitarGrip_Green],
flushedStates[NDSInputID_GuitarGrip_Red],
flushedStates[NDSInputID_GuitarGrip_Yellow],
flushedStates[NDSInputID_GuitarGrip_Blue]);
break;
case NDS_SLOT2_EASYPIANO:
piano_setKey(flushedStates[DSControllerState_Piano_C],
flushedStates[DSControllerState_Piano_CSharp],
flushedStates[DSControllerState_Piano_D],
flushedStates[DSControllerState_Piano_DSharp],
flushedStates[DSControllerState_Piano_E],
flushedStates[DSControllerState_Piano_F],
flushedStates[DSControllerState_Piano_FSharp],
flushedStates[DSControllerState_Piano_G],
flushedStates[DSControllerState_Piano_GSharp],
flushedStates[DSControllerState_Piano_A],
flushedStates[DSControllerState_Piano_ASharp],
flushedStates[DSControllerState_Piano_B],
flushedStates[DSControllerState_Piano_HighC]);
piano_setKey(flushedStates[NDSInputID_Piano_C],
flushedStates[NDSInputID_Piano_CSharp],
flushedStates[NDSInputID_Piano_D],
flushedStates[NDSInputID_Piano_DSharp],
flushedStates[NDSInputID_Piano_E],
flushedStates[NDSInputID_Piano_F],
flushedStates[NDSInputID_Piano_FSharp],
flushedStates[NDSInputID_Piano_G],
flushedStates[NDSInputID_Piano_GSharp],
flushedStates[NDSInputID_Piano_A],
flushedStates[NDSInputID_Piano_ASharp],
flushedStates[NDSInputID_Piano_B],
flushedStates[NDSInputID_Piano_HighC]);
break;
case NDS_SLOT2_PADDLE:
@ -511,9 +524,9 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
- (void) reset
{
for (size_t i = 0; i < DSControllerState_StatesCount; i++)
for (size_t i = 0; i < NDSInputID_InputCount; i++)
{
memset(ndsInput, 0, sizeof(ndsInput));
memset(clientInput, 0, sizeof(clientInput));
}
[self setAutohold:NO];
@ -521,32 +534,19 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
_isAutoholdCleared = YES;
_availableMicSamples = 0;
_hwMicLevelList->clear();
_micLevelTotal = 0.0f;
_micLevelsRead = 0.0f;
}
- (void) clearMicLevelMeasure
{
_hwMicLevelList->clear();
_micLevelTotal = 0.0f;
_micLevelsRead = 0.0f;
}
- (void) updateMicLevel
{
float avgMicLevel = 0.0f;
size_t recordedLevelCount = _hwMicLevelList->size();
for(size_t i = 0; i < recordedLevelCount; i++)
{
avgMicLevel += (*_hwMicLevelList)[i];
}
if (recordedLevelCount > 0)
{
avgMicLevel /= _hwMicLevelList->size();
}
else
{
avgMicLevel = 0.0f;
}
float avgMicLevel = _micLevelTotal / _micLevelsRead;
NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init];
[self setMicLevel:avgMicLevel];
@ -586,7 +586,8 @@ SineWaveGenerator sineWaveGenerator(250.0, MIC_SAMPLE_RATE);
theSample = sampleGenerator->generateSample();
}
_hwMicLevelList->push_back(fabs((float)theSample - MIC_NULL_SAMPLE_VALUE));
_micLevelTotal += (float)( (MIC_NULL_SAMPLE_VALUE > theSample) ? MIC_NULL_SAMPLE_VALUE - theSample : theSample - MIC_NULL_SAMPLE_VALUE );
_micLevelsRead += 1.0f;
return theSample;
}

View File

@ -1050,9 +1050,10 @@
const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO;
const NSUInteger controlID = cmdAttr.intValue[0];
const BOOL isTurboEnabled = (BOOL)cmdAttr.intValue[1];
const uint32_t turboPattern = (uint32_t)cmdAttr.intValue[2];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[[cdsCore cdsController] setControllerState:theState controlID:controlID turbo:isTurboEnabled];
[[cdsCore cdsController] setControllerState:theState controlID:controlID turbo:isTurboEnabled turboPattern:turboPattern];
}
- (void) cmdUpdateDSTouch:(NSValue *)cmdAttrValue
@ -1097,7 +1098,7 @@
if (cmdAttr.input.isAnalog)
{
const NSInteger paddleSensitivity = cmdAttr.floatValue[0];
const float paddleSensitivity = cmdAttr.floatValue[0];
const float paddleScalar = cmdAttr.input.scalar;
float paddleAdjust = (paddleScalar * 2.0f) - 1.0f;
@ -1113,8 +1114,8 @@
}
// Normalize the input value for the paddle.
paddleAdjust *= (float)paddleSensitivity;
[[cdsCore cdsController] setPaddleAdjust:paddleAdjust];
paddleAdjust *= paddleSensitivity;
[[cdsCore cdsController] setPaddleAdjust:(NSInteger)(paddleAdjust + 0.5f)];
}
else
{

View File

@ -1122,47 +1122,47 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
commandSelector["Enable/Disable GPU State"] = @selector(cmdToggleGPUState:);
// Generate the default command attributes for each command tag. (Do this in code rather than in an external file.)
CommandAttributes cmdDSControlRight = NewCommandAttributesForDSControl("Right", DSControllerState_Right, true);
CommandAttributes cmdDSControlLeft = NewCommandAttributesForDSControl("Left", DSControllerState_Left, true);
CommandAttributes cmdDSControlDown = NewCommandAttributesForDSControl("Down", DSControllerState_Down, true);
CommandAttributes cmdDSControlUp = NewCommandAttributesForDSControl("Up", DSControllerState_Up, true);
CommandAttributes cmdDSControlSelect = NewCommandAttributesForDSControl("Select", DSControllerState_Select, true);
CommandAttributes cmdDSControlStart = NewCommandAttributesForDSControl("Start", DSControllerState_Start, true);
CommandAttributes cmdDSControlB = NewCommandAttributesForDSControl("B", DSControllerState_B, true);
CommandAttributes cmdDSControlA = NewCommandAttributesForDSControl("A", DSControllerState_A, true);
CommandAttributes cmdDSControlY = NewCommandAttributesForDSControl("Y", DSControllerState_Y, true);
CommandAttributes cmdDSControlX = NewCommandAttributesForDSControl("X", DSControllerState_X, true);
CommandAttributes cmdDSControlL = NewCommandAttributesForDSControl("L", DSControllerState_L, true);
CommandAttributes cmdDSControlR = NewCommandAttributesForDSControl("R", DSControllerState_R, true);
CommandAttributes cmdDSControlDebug = NewCommandAttributesForDSControl("Debug", DSControllerState_Debug, false);
CommandAttributes cmdDSControlLid = NewCommandAttributesForDSControl("Lid", DSControllerState_Lid, false);
CommandAttributes cmdDSControlRight = NewCommandAttributesForDSControl("Right", NDSInputID_Right, true);
CommandAttributes cmdDSControlLeft = NewCommandAttributesForDSControl("Left", NDSInputID_Left, true);
CommandAttributes cmdDSControlDown = NewCommandAttributesForDSControl("Down", NDSInputID_Down, true);
CommandAttributes cmdDSControlUp = NewCommandAttributesForDSControl("Up", NDSInputID_Up, true);
CommandAttributes cmdDSControlSelect = NewCommandAttributesForDSControl("Select", NDSInputID_Select, true);
CommandAttributes cmdDSControlStart = NewCommandAttributesForDSControl("Start", NDSInputID_Start, true);
CommandAttributes cmdDSControlB = NewCommandAttributesForDSControl("B", NDSInputID_B, true);
CommandAttributes cmdDSControlA = NewCommandAttributesForDSControl("A", NDSInputID_A, true);
CommandAttributes cmdDSControlY = NewCommandAttributesForDSControl("Y", NDSInputID_Y, true);
CommandAttributes cmdDSControlX = NewCommandAttributesForDSControl("X", NDSInputID_X, true);
CommandAttributes cmdDSControlL = NewCommandAttributesForDSControl("L", NDSInputID_L, true);
CommandAttributes cmdDSControlR = NewCommandAttributesForDSControl("R", NDSInputID_R, true);
CommandAttributes cmdDSControlDebug = NewCommandAttributesForDSControl("Debug", NDSInputID_Debug, false);
CommandAttributes cmdDSControlLid = NewCommandAttributesForDSControl("Lid", NDSInputID_Lid, false);
CommandAttributes cmdDSControlTouch = NewCommandAttributesForDSControl("Touch", DSControllerState_Touch, false);
CommandAttributes cmdDSControlTouch = NewCommandAttributesForDSControl("Touch", NDSInputID_Touch, false);
cmdDSControlTouch.useInputForIntCoord = true;
CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone, false);
CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", NDSInputID_Microphone, false);
cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE;
cmdDSControlMic.floatValue[0] = 250.0f;
CommandAttributes cmdGuitarGripGreen = NewCommandAttributesForDSControl("Guitar Grip: Green", DSControllerState_GuitarGrip_Green, false);
CommandAttributes cmdGuitarGripRed = NewCommandAttributesForDSControl("Guitar Grip: Red", DSControllerState_GuitarGrip_Red, false);
CommandAttributes cmdGuitarGripYellow = NewCommandAttributesForDSControl("Guitar Grip: Yellow", DSControllerState_GuitarGrip_Yellow, false);
CommandAttributes cmdGuitarGripBlue = NewCommandAttributesForDSControl("Guitar Grip: Blue", DSControllerState_GuitarGrip_Blue, false);
CommandAttributes cmdPianoC = NewCommandAttributesForDSControl("Piano: C", DSControllerState_Piano_C, false);
CommandAttributes cmdPianoCSharp = NewCommandAttributesForDSControl("Piano: C#", DSControllerState_Piano_CSharp, false);
CommandAttributes cmdPianoD = NewCommandAttributesForDSControl("Piano: D", DSControllerState_Piano_D, false);
CommandAttributes cmdPianoDSharp = NewCommandAttributesForDSControl("Piano: D#", DSControllerState_Piano_DSharp, false);
CommandAttributes cmdPianoE = NewCommandAttributesForDSControl("Piano: E", DSControllerState_Piano_E, false);
CommandAttributes cmdPianoF = NewCommandAttributesForDSControl("Piano: F", DSControllerState_Piano_F, false);
CommandAttributes cmdPianoFSharp = NewCommandAttributesForDSControl("Piano: F#", DSControllerState_Piano_FSharp, false);
CommandAttributes cmdPianoG = NewCommandAttributesForDSControl("Piano: G", DSControllerState_Piano_G, false);
CommandAttributes cmdPianoGSharp = NewCommandAttributesForDSControl("Piano: G#", DSControllerState_Piano_GSharp, false);
CommandAttributes cmdPianoA = NewCommandAttributesForDSControl("Piano: A", DSControllerState_Piano_A, false);
CommandAttributes cmdPianoASharp = NewCommandAttributesForDSControl("Piano: A#", DSControllerState_Piano_ASharp, false);
CommandAttributes cmdPianoB = NewCommandAttributesForDSControl("Piano: B", DSControllerState_Piano_B, false);
CommandAttributes cmdPianoHighC = NewCommandAttributesForDSControl("Piano: High C", DSControllerState_Piano_HighC, false);
CommandAttributes cmdGuitarGripGreen = NewCommandAttributesForDSControl("Guitar Grip: Green", NDSInputID_GuitarGrip_Green, false);
CommandAttributes cmdGuitarGripRed = NewCommandAttributesForDSControl("Guitar Grip: Red", NDSInputID_GuitarGrip_Red, false);
CommandAttributes cmdGuitarGripYellow = NewCommandAttributesForDSControl("Guitar Grip: Yellow", NDSInputID_GuitarGrip_Yellow, false);
CommandAttributes cmdGuitarGripBlue = NewCommandAttributesForDSControl("Guitar Grip: Blue", NDSInputID_GuitarGrip_Blue, false);
CommandAttributes cmdPianoC = NewCommandAttributesForDSControl("Piano: C", NDSInputID_Piano_C, false);
CommandAttributes cmdPianoCSharp = NewCommandAttributesForDSControl("Piano: C#", NDSInputID_Piano_CSharp, false);
CommandAttributes cmdPianoD = NewCommandAttributesForDSControl("Piano: D", NDSInputID_Piano_D, false);
CommandAttributes cmdPianoDSharp = NewCommandAttributesForDSControl("Piano: D#", NDSInputID_Piano_DSharp, false);
CommandAttributes cmdPianoE = NewCommandAttributesForDSControl("Piano: E", NDSInputID_Piano_E, false);
CommandAttributes cmdPianoF = NewCommandAttributesForDSControl("Piano: F", NDSInputID_Piano_F, false);
CommandAttributes cmdPianoFSharp = NewCommandAttributesForDSControl("Piano: F#", NDSInputID_Piano_FSharp, false);
CommandAttributes cmdPianoG = NewCommandAttributesForDSControl("Piano: G", NDSInputID_Piano_G, false);
CommandAttributes cmdPianoGSharp = NewCommandAttributesForDSControl("Piano: G#", NDSInputID_Piano_GSharp, false);
CommandAttributes cmdPianoA = NewCommandAttributesForDSControl("Piano: A", NDSInputID_Piano_A, false);
CommandAttributes cmdPianoASharp = NewCommandAttributesForDSControl("Piano: A#", NDSInputID_Piano_ASharp, false);
CommandAttributes cmdPianoB = NewCommandAttributesForDSControl("Piano: B", NDSInputID_Piano_B, false);
CommandAttributes cmdPianoHighC = NewCommandAttributesForDSControl("Piano: High C", NDSInputID_Piano_HighC, false);
CommandAttributes cmdPaddle = NewCommandAttributesForDSControl("Paddle", DSControllerState_Paddle, false);
CommandAttributes cmdPaddle = NewCommandAttributesForDSControl("Paddle", NDSInputID_Paddle, false);
cmdPaddle.allowAnalogInput = true;
cmdPaddle.intValue[1] = 0;
cmdPaddle.floatValue[0] = 10.0f;
@ -1323,7 +1323,7 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
[self removeAllMappingsForCommandTag:[commandTag cStringUsingEncoding:NSUTF8StringEncoding]];
}
for(NSDictionary *deviceInfo in deviceInfoList)
for (NSDictionary *deviceInfo in deviceInfoList)
{
const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding];
CommandAttributes cmdAttr = defaultCommandAttributes[cmdTag];
@ -1341,6 +1341,11 @@ static std::unordered_map<unsigned short, std::string> keyboardNameTable; // Key
cmdAttr.intValue[0] = defaultCommandAttributes[cmdTag].intValue[0];
}
if (cmdAttr.selector == @selector(cmdUpdateDSControllerWithTurbo:))
{
cmdAttr.intValue[2] = defaultCommandAttributes[cmdTag].intValue[2];
}
// Copy all command attributes into a new deviceInfo dictionary.
NSMutableDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr,
[deviceInfo valueForKey:@"deviceCode"],
@ -2023,30 +2028,31 @@ CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const
switch (controlID)
{
case DSControllerState_Right:
case DSControllerState_Left:
case DSControllerState_Down:
case DSControllerState_Up:
case DSControllerState_Select:
case DSControllerState_Start:
case DSControllerState_B:
case DSControllerState_A:
case DSControllerState_Y:
case DSControllerState_X:
case DSControllerState_L:
case DSControllerState_R:
case NDSInputID_Right:
case NDSInputID_Left:
case NDSInputID_Down:
case NDSInputID_Up:
case NDSInputID_Select:
case NDSInputID_Start:
case NDSInputID_B:
case NDSInputID_A:
case NDSInputID_Y:
case NDSInputID_X:
case NDSInputID_L:
case NDSInputID_R:
cmdAttr.selector = @selector(cmdUpdateDSControllerWithTurbo:);
cmdAttr.intValue[2] = (supportTurbo) ? 0x33333333 : 0;
break;
case DSControllerState_Touch:
case NDSInputID_Touch:
cmdAttr.selector = @selector(cmdUpdateDSTouch:);
break;
case DSControllerState_Microphone:
case NDSInputID_Microphone:
cmdAttr.selector = @selector(cmdUpdateDSMicrophone:);
break;
case DSControllerState_Paddle:
case NDSInputID_Paddle:
cmdAttr.selector = @selector(cmdUpdateDSPaddle:);
break;