From cda10094dab0202418aa2f5b050c0d60473a53d0 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Mon, 16 Aug 2010 14:10:50 +1000 Subject: [PATCH] Updated to v067r22 release. byuu says: Added OV2's XAudio2 driver (it's better and faster than the DirectSound one) Fixed DirectInput keypad number codes Added launcher to make the profiles work Profiles now called: Accuracy, Compatibility, Performance (not debating names anymore) The launcher isn't going to work on OS X because of the .app folder bullshit (yes, yes, .sfc folders.) It also crashes on Windows XP for god only knows what reason. Works fine on Windows 7 and Linux. So XP users, rename the .dll files to .exe to test this release. I'll fix it on Monday. The color highlighting fucks up the radio boxes on the Windows classic theme, because Nokia can't afford a god damn QA team. Lastly, I forgot to add launcher to the make archive-all command, so the source for it will be in the next WIP. --- Makefile | 6 +- qt/Makefile | 2 +- qt/application/application.cpp | 2 + qt/settings/profile.cpp | 74 ++-- qt/settings/profile.moc.hpp | 12 +- ruby/_test/cc.bat | 2 + ruby/_test/test.cpp | 40 +++ ruby/_test/test.exe | Bin 0 -> 249658 bytes ruby/audio/xaudio2.cpp | 200 +++++++++++ ruby/audio/xaudio2.hpp | 336 ++++++++++++++++++ ruby/input/directinput.cpp | 20 +- ruby/ruby.cpp | 16 +- ruby/ruby_impl.cpp | 4 + snes/Makefile | 8 +- ...file-research.hpp => profile-accuracy.hpp} | 3 +- ...baseline.hpp => profile-compatibility.hpp} | 3 +- snes/profile-performance.hpp | 1 - snes/snes.hpp | 10 +- 18 files changed, 671 insertions(+), 68 deletions(-) create mode 100755 ruby/_test/cc.bat create mode 100755 ruby/_test/test.cpp create mode 100755 ruby/_test/test.exe create mode 100755 ruby/audio/xaudio2.cpp create mode 100755 ruby/audio/xaudio2.hpp rename snes/{profile-research.hpp => profile-accuracy.hpp} (54%) rename snes/{profile-baseline.hpp => profile-compatibility.hpp} (55%) diff --git a/Makefile b/Makefile index 5a4406a7..771e98ff 100755 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ include nall/Makefile snes := snes -profile := research +profile := accuracy ui := qt # compiler @@ -61,14 +61,14 @@ endif install: ifeq ($(platform),x) - install -D -m 755 out/bsnes $(DESTDIR)$(prefix)/bin/bsnes + install -D -m 755 out/bsnes-$(profile) $(DESTDIR)$(prefix)/bin/bsnes-$(profile) install -D -m 644 qt/data/bsnes.png $(DESTDIR)$(prefix)/share/pixmaps/bsnes.png install -D -m 644 qt/data/bsnes.desktop $(DESTDIR)$(prefix)/share/applications/bsnes.desktop endif uninstall: ifeq ($(platform),x) - rm $(DESTDIR)$(prefix)/bin/bsnes + rm $(DESTDIR)$(prefix)/bin/bsnes-$(profile) rm $(DESTDIR)$(prefix)/share/pixmaps/bsnes.png rm $(DESTDIR)$(prefix)/share/applications/bsnes.desktop endif diff --git a/qt/Makefile b/qt/Makefile index f12893f3..fb4b74e0 100755 --- a/qt/Makefile +++ b/qt/Makefile @@ -26,7 +26,7 @@ else ifeq ($(platform),osx) link += $(if $(findstring audio.openal,$(ruby)),-framework OpenAL) else ifeq ($(platform),win) ruby := video.direct3d video.wgl video.directdraw video.gdi video.qtraster - ruby += audio.directsound + ruby += audio.directsound audio.xaudio2 ruby += input.rawinput input.directinput link += $(if $(findstring audio.openal,$(ruby)),-lopenal32) diff --git a/qt/application/application.cpp b/qt/application/application.cpp index 8fdcdc8c..7228bc46 100755 --- a/qt/application/application.cpp +++ b/qt/application/application.cpp @@ -61,6 +61,8 @@ void Application::locateFile(string &filename, bool createDataDirectory) { } int Application::main(int &argc, char **argv) { + CoInitialize(0); + app = new App(argc, argv); #if !defined(PLATFORM_WIN) //Windows port uses 256x256 icon from resource file diff --git a/qt/settings/profile.cpp b/qt/settings/profile.cpp index 4fe2705d..23b53733 100755 --- a/qt/settings/profile.cpp +++ b/qt/settings/profile.cpp @@ -16,75 +16,87 @@ ProfileSettingsWindow::ProfileSettingsWindow() { layout->addWidget(profileInfo); layout->addSpacing(Style::WidgetSpacing); - profileResearch = new QRadioButton("Research"); - profileResearch->setStyleSheet("font-weight: bold; font-size: 12pt;"); - layout->addWidget(profileResearch); + profileAccuracy = new QRadioButton("Accuracy"); + profileAccuracy->setStyleSheet( + "font-weight: bold;" + "font-size: 12pt;" + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(255, 0, 0, 48), stop: 1 rgba(255, 0, 0, 0));" + ); + layout->addWidget(profileAccuracy); - profileResearchInfo = new QLabel( + profileAccuracyInfo = new QLabel( "System Requirements: A super-computer cooled by LN2.
" "Maximum accuracy, no matter the cost.
" - "Use this mode for development purposes only." + "Use this mode for development or research purposes." ); - profileResearchInfo->setStyleSheet("margin-left: 22px;"); - layout->addWidget(profileResearchInfo); + profileAccuracyInfo->setStyleSheet("margin-left: 22px;"); + layout->addWidget(profileAccuracyInfo); layout->addSpacing(Style::WidgetSpacing); - profileBaseline = new QRadioButton("Baseline (recommended)"); - profileBaseline->setStyleSheet("font-weight: bold; font-size: 12pt;"); - layout->addWidget(profileBaseline); + profileCompatibility = new QRadioButton("Compatibility"); + profileCompatibility->setStyleSheet( + "font-weight: bold;" + "font-size: 12pt;" + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(0, 0, 255, 48), stop: 1 rgba(0, 0, 255, 0));" + ); + layout->addWidget(profileCompatibility); - profileBaselineInfo = new QLabel( + profileCompatibilityInfo = new QLabel( "System Requirements: Intel Core Solo or AMD Athlon 64 processor.
" "Extreme accuracy with reasonable hardware requirements in mind.
" - "Very rarely, slight graphical glitches may appear." + "Very rarely, slight graphical glitches may appear in a small number of games." ); - profileBaselineInfo->setStyleSheet("margin-left: 22px;"); - layout->addWidget(profileBaselineInfo); + profileCompatibilityInfo->setStyleSheet("margin-left: 22px;"); + layout->addWidget(profileCompatibilityInfo); layout->addSpacing(Style::WidgetSpacing); profilePerformance = new QRadioButton("Performance"); - profilePerformance->setStyleSheet("font-weight: bold; font-size: 12pt;"); + profilePerformance->setStyleSheet( + "font-weight: bold;" + "font-size: 12pt;" + "background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 rgba(0, 255, 0, 48), stop: 1 rgba(0, 255, 0, 0));" + ); layout->addWidget(profilePerformance); profilePerformanceInfo = new QLabel( "System Requirements: Intel Atom, Intel Pentium IV or AMD Athlon processor.
" - "High accuracy with reasonable sacrifices for performance.
" + "High accuracy with reasonable compromises for performance.
" "Sacrifices a small degree of compatibility to run full-speed on older hardware.
" - "Use this mode only if baseline is too slow, or if you are running on battery power." + "Use this mode for slower systems, or if you are running on battery power." ); profilePerformanceInfo->setStyleSheet("margin-left: 22px;"); layout->addWidget(profilePerformanceInfo); - if(config().system.profile == "research") { - profileResearch->setChecked(true); - } else if(config().system.profile == "baseline") { - profileBaseline->setChecked(true); + if(config().system.profile == "accuracy") { + profileAccuracy->setChecked(true); + } else if(config().system.profile == "compatibility") { + profileCompatibility->setChecked(true); } else if(config().system.profile == "performance") { profilePerformance->setChecked(true); } else { - config().system.profile = "baseline"; - profileBaseline->setChecked(true); + config().system.profile = "compatibility"; + profileCompatibility->setChecked(true); QMessageBox::information(0, "First-Run Notice", "Note: bsnes contains multiple emulation profiles.

" - "If bsnes runs too slowly, you can double the speed by using the " + "If bsnes runs too slowly, you can greatly increase the speed by using the " "'Performance' profile; or if you want even more accuracy, you can use the " - "'Research' profile.

" + "'Accuracy' profile.

" "Feel free to experiment. You can select different profiles via:
" "Settings -> Configuration -> Profile" ); } - connect(profileResearch, SIGNAL(pressed()), this, SLOT(setResearchProfile())); - connect(profileBaseline, SIGNAL(pressed()), this, SLOT(setBaselineProfile())); + connect(profileAccuracy, SIGNAL(pressed()), this, SLOT(setAccuracyProfile())); + connect(profileCompatibility, SIGNAL(pressed()), this, SLOT(setCompatibilityProfile())); connect(profilePerformance, SIGNAL(pressed()), this, SLOT(setPerformanceProfile())); } -void ProfileSettingsWindow::setResearchProfile() { - config().system.profile = "research"; +void ProfileSettingsWindow::setAccuracyProfile() { + config().system.profile = "accuracy"; } -void ProfileSettingsWindow::setBaselineProfile() { - config().system.profile = "baseline"; +void ProfileSettingsWindow::setCompatibilityProfile() { + config().system.profile = "compatibility"; } void ProfileSettingsWindow::setPerformanceProfile() { diff --git a/qt/settings/profile.moc.hpp b/qt/settings/profile.moc.hpp index 16f06e53..cb156749 100755 --- a/qt/settings/profile.moc.hpp +++ b/qt/settings/profile.moc.hpp @@ -4,18 +4,18 @@ class ProfileSettingsWindow : public QWidget { public: QVBoxLayout *layout; QLabel *profileInfo; - QRadioButton *profileResearch; - QLabel *profileResearchInfo; - QRadioButton *profileBaseline; - QLabel *profileBaselineInfo; + QRadioButton *profileAccuracy; + QLabel *profileAccuracyInfo; + QRadioButton *profileCompatibility; + QLabel *profileCompatibilityInfo; QRadioButton *profilePerformance; QLabel *profilePerformanceInfo; ProfileSettingsWindow(); private slots: - void setResearchProfile(); - void setBaselineProfile(); + void setAccuracyProfile(); + void setCompatibilityProfile(); void setPerformanceProfile(); }; diff --git a/ruby/_test/cc.bat b/ruby/_test/cc.bat new file mode 100755 index 00000000..00b9e552 --- /dev/null +++ b/ruby/_test/cc.bat @@ -0,0 +1,2 @@ +@g++ -std=gnu++0x -O3 -fomit-frame-pointer -I../.. -o test test.cpp -DAUDIO_DIRECTSOUND -DAUDIO_XAUDIO2 -DINPUT_DIRECTINPUT -lole32 -luuid -ldxguid -ldsound -ldinput8 +@pause diff --git a/ruby/_test/test.cpp b/ruby/_test/test.cpp new file mode 100755 index 00000000..64778930 --- /dev/null +++ b/ruby/_test/test.cpp @@ -0,0 +1,40 @@ +#include +#include +using namespace nall; + +#include +using namespace ruby; + +#include + +int main() { + CoInitialize(0); + + audio.driver("XAudio2"); + audio.set(Audio::Handle, (uintptr_t)GetDesktopWindow()); + audio.set(Audio::Synchronize, true); + audio.set(Audio::Frequency, 44100U); + if(audio.init() == false) { + printf("Failed to initialize audio driver.\n"); + getch(); + return 0; + } + + input.driver("DirectInput"); + input.set(Input::Handle, (uintptr_t)GetDesktopWindow()); + if(input.init() == false) { + printf("Failed to initialize input driver.\n"); + getch(); + return 0; + } + + while(true) { + int16_t table[Scancode::Limit]; + input.poll(table); + for(unsigned i = 0; i < Scancode::Limit; i++) { + //if(table[i]) printf("%.4x\n", i); + } + } + + return 0; +} diff --git a/ruby/_test/test.exe b/ruby/_test/test.exe new file mode 100755 index 0000000000000000000000000000000000000000..8032f45adc9d99fc84352701818ca2783191bcd6 GIT binary patch literal 249658 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

KkxUadXJ=*zpa*4swE4xib}16_W&}v z{}iq>;Hoq(WNRgr+7(P1xY(G_7%ce_>8)6prrg(qg;p%QT&?h^2k>Q7nlq?A zIhWIq6EPVVBx8}K=3aQ2>h=UCW#CH7y0*uj zdc^ofb-{Xzb0Jp^3^vN2Qh%a^g_C_7CX!lNrFW1~2d!)&g)>Cx$ik88dhmv!Kj7+M zgT;m)pnfF2=Itw0#c)7!z$)D>dx9fv*Crgs=%%3^yx(K>NAZ0P-|upf{`<%(O%uG9 z1mhYW+Bm@qEp=sR*qd;7^4?{`&4){{GLDSaV3Ec1HfL=4SjNF{l)ys^@-`f~{CGz$ zKUUX!W9ctZd|$x)CZykEroSXU{Uusd<-%@cpuJ9QJNBj$Pg%QQinFMgC6Z{e0~5 zP82@ivUa~)d6~!dInNR0jsHE$gH0*7scta~pCiuSy^6i51l?WKrtV^_y9d9lu35Gb>lGGPUy8_cb- zf?OOAdDRb#uwV9m&VI475`X-iJV6=GC_t{ zV!tx4hHF^%qWE#g&UB}e94juhxXNjfcMaAzgmZx9{YJf~9Scndu}7sz&re*NjB7cK zg^ZF)Rd^C;zgAS4?YR|GNwGlb)lU|#;d%r_{lcl9NSCYHn<)mq!V@(b-ZF> z?Kkj!e1WNY%Flt~YHUAz67|KLm1=RdRuW93|5>TIJ<jL2z(kq1P5pbniBUadp%e9jri%a08z?s4qb?)yC z2P(jv45^8Ckd1@S6|O@$Sev7(NAutX48JDBgzh8kc7{DA!=mdFlNnZ(NH-i%>ZsvF z__5dB>atn5l%%k^!>k1ft4BCQw45PPG z*Y3jc{6(B@K8Rxu31U2^Uwb{Mk4t{P;MYpsf*ER~&0ikcYMT$?PJ|dbqB{#lzd2T$ zD@b%)JpaO4ZJVpS0elySE78O!gkobC2hWxs#wN-p#s3GK@}QV|@U%y%7K$}0 z&RnAV;gSS7!eIXgJMpTRZH0NRL)sK=PCBbNhrpsv{3rKD1DWXK1Z8vT9pm>`-$Y_C&Oq)F@-ewO9FUJ`Tdh>T=c#otg_ud2n zc#pJK7R-UO<~`Cu@lT{kpuCscw1HR+@ee1(pSe{zgl`8fRQ&x(QfS2&^tm`$1>b|m z*?S;x#Wn~8ZT$UO49?%-lteJPH#i=1Tsl?fB{)^*g?U~pK^ww?@Tf(a@L`;QP9W@S z5Vo>6E9M1*P<%pywWuNWENNpl>`W#c)CLO!1q<8-_1D~^M7q-)_z!=YNkoaSgzLL zXokD>D#b5x$bKN!8uK<)i6DH6e_09^PVludPNJQMMLgKD@az^;VXDVGeK8%D@K)K`&9`_&=Y?lLHy#2tVK$D2T0tAMd}0oD|cs|3?JmvR}BpPkYAMg8E@g$mm6sL614Y9@9emiVft+ZjiSEI*1kJ#g4S~M@d9;n6I z+Hoa_HgG12j5oK9=w99f*wH^3N~`j~)g9Xq@_nlJh*i1oZ+LHUyt(IJ_!#m-$>+VR zz~_8~uXtYu+`)jE2#A-^|LC=dF^v+sC1GH`C0vw5{WLpFjM|+*?G9(Mu#K`XD+^0Q zfM;H6nc}bi8HQ{^+Q3hh1*`BHat0x0o*X*^c28MVix2aP80jE8B|&To1k$;|gWF?x zvrPH+K;i2AcC&4Q^y0|oK;hH*?Ueh*gC7wzF;a6}(uKZt!)E{S(pF%AJuX_=X^{Kr z$D0DQyb;)#$A_Q95;NNLJM3J9Z-Rt0{2G(93BQG5IF$IPp*?44VwWZS^j1ST={Q}9 z{e>0HQtW}15c@*J9v9cpOAmaS8L$6wz!j<>ah6N)CAgC$mcLV`i~ zN7N>&K<9(K_>R4hBYUi?o|n*7@$(Ujv=O%On^3glYL<}5h+Q`P(f=V$>G4)EuABlG zv|r2Had+*wa?V42R(vdb&*g8S_gwY~#YASoCCw46ONR<7#|)0%ucL99 z59c!rL8AB$!1z{m6*C2Q+vhViT+o4q&9bJ-l7x$PTB=I6<0oPwi=*XQS#I0sWV(nl z`O9g?H^(e%l1`HxQE{zLQ{+XgU!iA;Z+K)~yB@pDlSP@me`}ettgK^~b%rQw75dC? zs-Gy!n7wKE{K_~QXpcV{XvZ8QydMiA(}URabeG76Hxm88MDmDW@AxTS@5nivbC~(N zN({1|@nk)tADuzg2@B%WnXg

={4R>?sxK^=OYcp1DAz($Li&$Cl|IgiQYg)9~A6 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 literal 0 HcmV?d00001 diff --git a/ruby/audio/xaudio2.cpp b/ruby/audio/xaudio2.cpp new file mode 100755 index 00000000..d6298593 --- /dev/null +++ b/ruby/audio/xaudio2.cpp @@ -0,0 +1,200 @@ +/* + audio.xaudio2 (2010-08-14) + author: OV2 +*/ + +#include "xaudio2.hpp" +#include + +namespace ruby { + +class pAudioXAudio2: public IXAudio2VoiceCallback { +public: + IXAudio2 *pXAudio2; + IXAudio2MasteringVoice* pMasterVoice; + IXAudio2SourceVoice *pSourceVoice; + + // inherited from IXAudio2VoiceCallback + STDMETHODIMP_(void) OnBufferStart(void *pBufferContext){} + STDMETHODIMP_(void) OnLoopEnd(void *pBufferContext){} + STDMETHODIMP_(void) OnStreamEnd() {} + STDMETHODIMP_(void) OnVoiceError(void *pBufferContext, HRESULT Error) {} + STDMETHODIMP_(void) OnVoiceProcessingPassEnd() {} + STDMETHODIMP_(void) OnVoiceProcessingPassStart(UINT32 BytesRequired) {} + + struct { + unsigned buffers; + unsigned latency; + + uint32_t *buffer; + unsigned bufferoffset; + + volatile long submitbuffers; + unsigned writebuffer; + } device; + + struct { + bool synchronize; + unsigned frequency; + unsigned latency; + } settings; + + bool cap(const string& name) { + if(name == Audio::Synchronize) return true; + if(name == Audio::Frequency) return true; + if(name == Audio::Latency) return true; + return false; + } + + any get(const string& name) { + if(name == Audio::Synchronize) return settings.synchronize; + if(name == Audio::Frequency) return settings.frequency; + if(name == Audio::Latency) return settings.latency; + return false; + } + + bool set(const string& name, const any& value) { + if(name == Audio::Synchronize) { + settings.synchronize = any_cast(value); + if(pXAudio2) clear(); + return true; + } + + if(name == Audio::Frequency) { + settings.frequency = any_cast(value); + if(pXAudio2) init(); + return true; + } + + if(name == Audio::Latency) { + settings.latency = any_cast(value); + if(pXAudio2) init(); + return true; + } + + return false; + } + + void pushbuffer(unsigned bytes,uint32_t *pAudioData) { + XAUDIO2_BUFFER xa2buffer={0}; + xa2buffer.AudioBytes=bytes; + xa2buffer.pAudioData=reinterpret_cast(pAudioData); + xa2buffer.pContext=0; + InterlockedIncrement(&device.submitbuffers); + pSourceVoice->SubmitSourceBuffer(&xa2buffer); + } + + void sample(uint16_t left, uint16_t right) { + device.buffer[device.writebuffer * device.latency + device.bufferoffset++] = left + (right << 16); + if(device.bufferoffset < device.latency) return; + device.bufferoffset = 0; + + if(device.submitbuffers == device.buffers - 1) { + if(settings.synchronize == true) { + //wait until there is at least one other free buffer for the next sample + while(device.submitbuffers == device.buffers - 1) { + //Sleep(0); + } + } else { //we need one free buffer for the next sample, so ignore the current contents + return; + } + } + + pushbuffer(device.latency * 4,device.buffer + device.writebuffer * device.latency); + + device.writebuffer = (device.writebuffer + 1) % device.buffers; + } + + void clear() { + if(!pSourceVoice) return; + pSourceVoice->Stop(0); + pSourceVoice->FlushSourceBuffers(); //calls OnBufferEnd for all currently submitted buffers + + device.writebuffer = 0; + + device.bufferoffset = 0; + if(device.buffer) memset(device.buffer, 0, device.latency * device.buffers * 4); + + pSourceVoice->Start(0); + } + + bool init() { + term(); + + device.buffers = 8; + device.latency = settings.frequency * settings.latency / device.buffers / 1000.0 + 0.5; + device.buffer = new uint32_t[device.latency * device.buffers]; + device.bufferoffset = 0; + device.submitbuffers = 0; + + HRESULT hr; + if(FAILED(hr = XAudio2Create(&pXAudio2, 0 , XAUDIO2_DEFAULT_PROCESSOR))) { + return false; + } + + if(FAILED(hr = pXAudio2->CreateMasteringVoice( &pMasterVoice, 2, + settings.frequency, 0, 0 , NULL))) { + return false; + } + + WAVEFORMATEX wfx; + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = 2; + wfx.nSamplesPerSec = settings.frequency; + wfx.nBlockAlign = 4; + wfx.wBitsPerSample = 16; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + wfx.cbSize = 0; + + if(FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx, + XAUDIO2_VOICE_NOSRC , XAUDIO2_DEFAULT_FREQ_RATIO, this, NULL, NULL))) { + return false; + } + + clear(); + return true; + } + + void term() { + if(pSourceVoice) { + pSourceVoice->Stop(0); + pSourceVoice->DestroyVoice(); + pSourceVoice = 0; + } + if(pMasterVoice) { + pMasterVoice->DestroyVoice(); + pMasterVoice = 0; + } + if(pXAudio2) { + pXAudio2->Release(); + pXAudio2 = NULL; + } + if(device.buffer) { + delete[] device.buffer; + device.buffer = 0; + } + } + + STDMETHODIMP_(void) OnBufferEnd(void *pBufferContext) { + InterlockedDecrement(&device.submitbuffers); + } + + pAudioXAudio2() { + pXAudio2 = 0; + pMasterVoice = 0; + pSourceVoice = 0; + + device.buffer = 0; + device.bufferoffset = 0; + device.submitbuffers = 0; + device.writebuffer = 0; + + settings.synchronize = false; + settings.frequency = 22050; + settings.latency = 120; + } +}; + +DeclareAudio(XAudio2) + +}; diff --git a/ruby/audio/xaudio2.hpp b/ruby/audio/xaudio2.hpp new file mode 100755 index 00000000..86e19471 --- /dev/null +++ b/ruby/audio/xaudio2.hpp @@ -0,0 +1,336 @@ +/* + xaudio2.hpp (2010-08-14) + author: OV2 + + ruby-specific header to provide mingw-friendly xaudio2 interfaces +*/ + +#ifndef XAUDIO2_RUBY_H +#define XAUDIO2_RUBY_H + +#include + +#define DEFINE_GUID_X(n,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) GUID_EXT const GUID n GUID_SECT = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}} +#define DEFINE_CLSID_X(className, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(CLSID_##className, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define DEFINE_IID_X(interfaceName, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + DEFINE_GUID_X(IID_##interfaceName, 0x##l, 0x##w1, 0x##w2, 0x##b1, 0x##b2, 0x##b3, 0x##b4, 0x##b5, 0x##b6, 0x##b7, 0x##b8) +#define X2DEFAULT(x) =x + +DEFINE_CLSID_X(XAudio2, e21a7345, eb21, 468e, be, 50, 80, 4d, b9, 7c, f7, 08); +DEFINE_CLSID_X(XAudio2_Debug, f7a76c21, 53d4, 46bb, ac, 53, 8b, 45, 9c, ae, 46, bd); +DEFINE_IID_X(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); + +DECLARE_INTERFACE(IXAudio2Voice); + +#define XAUDIO2_COMMIT_NOW 0 +#define XAUDIO2_DEFAULT_CHANNELS 0 +#define XAUDIO2_DEFAULT_SAMPLERATE 0 +#define XAUDIO2_DEFAULT_FREQ_RATIO 4.0f +#define XAUDIO2_DEBUG_ENGINE 0x0001 +#define XAUDIO2_VOICE_NOSRC 0x0004 + +typedef struct +{ + WAVEFORMATEX Format; + union + { + WORD wValidBitsPerSample; + WORD wSamplesPerBlock; + WORD wReserved; + } Samples; + DWORD dwChannelMask; + GUID SubFormat; +} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE; +typedef const WAVEFORMATEXTENSIBLE* LPCWAVEFORMATEXTENSIBLE; + +typedef enum XAUDIO2_DEVICE_ROLE +{ + NotDefaultDevice = 0x0, + DefaultConsoleDevice = 0x1, + DefaultMultimediaDevice = 0x2, + DefaultCommunicationsDevice = 0x4, + DefaultGameDevice = 0x8, + GlobalDefaultDevice = 0xf, + InvalidDeviceRole = ~GlobalDefaultDevice +} XAUDIO2_DEVICE_ROLE; + +typedef struct XAUDIO2_DEVICE_DETAILS +{ + WCHAR DeviceID[256]; + WCHAR DisplayName[256]; + XAUDIO2_DEVICE_ROLE Role; + WAVEFORMATEXTENSIBLE OutputFormat; +} XAUDIO2_DEVICE_DETAILS; + +typedef struct XAUDIO2_VOICE_DETAILS +{ + UINT32 CreationFlags; + UINT32 InputChannels; + UINT32 InputSampleRate; +} XAUDIO2_VOICE_DETAILS; + +typedef enum XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER +{ + Processor1 = 0x00000001, + Processor2 = 0x00000002, + Processor3 = 0x00000004, + Processor4 = 0x00000008, + Processor5 = 0x00000010, + Processor6 = 0x00000020, + Processor7 = 0x00000040, + Processor8 = 0x00000080, + Processor9 = 0x00000100, + Processor10 = 0x00000200, + Processor11 = 0x00000400, + Processor12 = 0x00000800, + Processor13 = 0x00001000, + Processor14 = 0x00002000, + Processor15 = 0x00004000, + Processor16 = 0x00008000, + Processor17 = 0x00010000, + Processor18 = 0x00020000, + Processor19 = 0x00040000, + Processor20 = 0x00080000, + Processor21 = 0x00100000, + Processor22 = 0x00200000, + Processor23 = 0x00400000, + Processor24 = 0x00800000, + Processor25 = 0x01000000, + Processor26 = 0x02000000, + Processor27 = 0x04000000, + Processor28 = 0x08000000, + Processor29 = 0x10000000, + Processor30 = 0x20000000, + Processor31 = 0x40000000, + Processor32 = 0x80000000, + XAUDIO2_ANY_PROCESSOR = 0xffffffff, + XAUDIO2_DEFAULT_PROCESSOR = XAUDIO2_ANY_PROCESSOR +} XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, XAUDIO2_PROCESSOR; + +typedef struct XAUDIO2_VOICE_SENDS +{ + UINT32 OutputCount; + IXAudio2Voice** pOutputVoices; +} XAUDIO2_VOICE_SENDS; + +typedef struct XAUDIO2_EFFECT_DESCRIPTOR +{ + IUnknown* pEffect; + BOOL InitialState; + UINT32 OutputChannels; +} XAUDIO2_EFFECT_DESCRIPTOR; + +typedef struct XAUDIO2_EFFECT_CHAIN +{ + UINT32 EffectCount; + const XAUDIO2_EFFECT_DESCRIPTOR* pEffectDescriptors; +} XAUDIO2_EFFECT_CHAIN; + +typedef enum XAUDIO2_FILTER_TYPE +{ + LowPassFilter, + BandPassFilter, + HighPassFilter +} XAUDIO2_FILTER_TYPE; + +typedef struct XAUDIO2_FILTER_PARAMETERS +{ + XAUDIO2_FILTER_TYPE Type; + float Frequency; + float OneOverQ; + +} XAUDIO2_FILTER_PARAMETERS; + +typedef struct XAUDIO2_BUFFER +{ + UINT32 Flags; + UINT32 AudioBytes; + const BYTE* pAudioData; + UINT32 PlayBegin; + UINT32 PlayLength; + UINT32 LoopBegin; + UINT32 LoopLength; + UINT32 LoopCount; + void* pContext; +} XAUDIO2_BUFFER; + +typedef struct XAUDIO2_BUFFER_WMA +{ + const UINT32* pDecodedPacketCumulativeBytes; + UINT32 PacketCount; +} XAUDIO2_BUFFER_WMA; + +typedef struct XAUDIO2_VOICE_STATE +{ + void* pCurrentBufferContext; + UINT32 BuffersQueued; + UINT64 SamplesPlayed; +} XAUDIO2_VOICE_STATE; + +typedef struct XAUDIO2_PERFORMANCE_DATA +{ + UINT64 AudioCyclesSinceLastQuery; + UINT64 TotalCyclesSinceLastQuery; + UINT32 MinimumCyclesPerQuantum; + UINT32 MaximumCyclesPerQuantum; + UINT32 MemoryUsageInBytes; + UINT32 CurrentLatencyInSamples; + UINT32 GlitchesSinceEngineStarted; + UINT32 ActiveSourceVoiceCount; + UINT32 TotalSourceVoiceCount; + UINT32 ActiveSubmixVoiceCount; + UINT32 TotalSubmixVoiceCount; + UINT32 ActiveXmaSourceVoices; + UINT32 ActiveXmaStreams; +} XAUDIO2_PERFORMANCE_DATA; + +typedef struct XAUDIO2_DEBUG_CONFIGURATION +{ + UINT32 TraceMask; + UINT32 BreakMask; + BOOL LogThreadID; + BOOL LogFileline; + BOOL LogFunctionName; + BOOL LogTiming; +} XAUDIO2_DEBUG_CONFIGURATION; + +DECLARE_INTERFACE(IXAudio2EngineCallback) +{ + STDMETHOD_(void, OnProcessingPassStart) (THIS) PURE; + STDMETHOD_(void, OnProcessingPassEnd) (THIS) PURE; + STDMETHOD_(void, OnCriticalError) (THIS_ HRESULT Error) PURE; +}; + +DECLARE_INTERFACE(IXAudio2VoiceCallback) +{ + STDMETHOD_(void, OnVoiceProcessingPassStart) (THIS_ UINT32 BytesRequired) PURE; + STDMETHOD_(void, OnVoiceProcessingPassEnd) (THIS) PURE; + STDMETHOD_(void, OnStreamEnd) (THIS) PURE; + STDMETHOD_(void, OnBufferStart) (THIS_ void* pBufferContext) PURE; + STDMETHOD_(void, OnBufferEnd) (THIS_ void* pBufferContext) PURE; + STDMETHOD_(void, OnLoopEnd) (THIS_ void* pBufferContext) PURE; + STDMETHOD_(void, OnVoiceError) (THIS_ void* pBufferContext, HRESULT Error) PURE; +}; + +DECLARE_INTERFACE(IXAudio2Voice) +{ + #define Declare_IXAudio2Voice_Methods() \ + STDMETHOD_(void, GetVoiceDetails) (THIS_ XAUDIO2_VOICE_DETAILS* pVoiceDetails) PURE; \ + STDMETHOD(SetOutputVoices) (THIS_ const XAUDIO2_VOICE_SENDS* pSendList) PURE; \ + STDMETHOD(SetEffectChain) (THIS_ const XAUDIO2_EFFECT_CHAIN* pEffectChain) PURE; \ + STDMETHOD(EnableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD(DisableEffect) (THIS_ UINT32 EffectIndex, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetEffectState) (THIS_ UINT32 EffectIndex, BOOL* pEnabled) PURE; \ + STDMETHOD(SetEffectParameters) (THIS_ UINT32 EffectIndex, \ + const void* pParameters, \ + UINT32 ParametersByteSize, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD(GetEffectParameters) (THIS_ UINT32 EffectIndex, void* pParameters, \ + UINT32 ParametersByteSize) PURE; \ + STDMETHOD(SetFilterParameters) (THIS_ const XAUDIO2_FILTER_PARAMETERS* pParameters, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetFilterParameters) (THIS_ XAUDIO2_FILTER_PARAMETERS* pParameters) PURE; \ + STDMETHOD(SetVolume) (THIS_ float Volume, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetVolume) (THIS_ float* pVolume) PURE; \ + STDMETHOD(SetChannelVolumes) (THIS_ UINT32 Channels, const float* pVolumes, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetChannelVolumes) (THIS_ UINT32 Channels, float* pVolumes) PURE; \ + STDMETHOD(SetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + const float* pLevelMatrix, \ + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; \ + STDMETHOD_(void, GetOutputMatrix) (THIS_ IXAudio2Voice* pDestinationVoice, \ + UINT32 SourceChannels, UINT32 DestinationChannels, \ + float* pLevelMatrix) PURE; \ + STDMETHOD_(void, DestroyVoice) (THIS) PURE + + Declare_IXAudio2Voice_Methods(); +}; + + +DECLARE_INTERFACE_(IXAudio2MasteringVoice, IXAudio2Voice) +{ + Declare_IXAudio2Voice_Methods(); +}; + +DECLARE_INTERFACE_(IXAudio2SubmixVoice, IXAudio2Voice) +{ + Declare_IXAudio2Voice_Methods(); +}; + +DECLARE_INTERFACE_(IXAudio2SourceVoice, IXAudio2Voice) +{ + Declare_IXAudio2Voice_Methods(); + STDMETHOD(Start) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD(Stop) (THIS_ UINT32 Flags, UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD(SubmitSourceBuffer) (THIS_ const XAUDIO2_BUFFER* pBuffer, const XAUDIO2_BUFFER_WMA* pBufferWMA X2DEFAULT(NULL)) PURE; + STDMETHOD(FlushSourceBuffers) (THIS) PURE; + STDMETHOD(Discontinuity) (THIS) PURE; + STDMETHOD(ExitLoop) (THIS_ UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD_(void, GetState) (THIS_ XAUDIO2_VOICE_STATE* pVoiceState) PURE; + STDMETHOD(SetFrequencyRatio) (THIS_ float Ratio, + UINT32 OperationSet X2DEFAULT(XAUDIO2_COMMIT_NOW)) PURE; + STDMETHOD_(void, GetFrequencyRatio) (THIS_ float* pRatio) PURE; +}; + +DECLARE_INTERFACE_(IXAudio2, IUnknown) +{ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, void** ppvInterface) PURE; + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + STDMETHOD_(ULONG, Release) (THIS) PURE; + STDMETHOD(GetDeviceCount) (THIS_ UINT32* pCount) PURE; + STDMETHOD(GetDeviceDetails) (THIS_ UINT32 Index, XAUDIO2_DEVICE_DETAILS* pDeviceDetails) PURE; + STDMETHOD(Initialize) (THIS_ UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) PURE; + STDMETHOD(RegisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; + STDMETHOD_(void, UnregisterForCallbacks) (IXAudio2EngineCallback* pCallback) PURE; + STDMETHOD(CreateSourceVoice) (THIS_ IXAudio2SourceVoice** ppSourceVoice, + const WAVEFORMATEX* pSourceFormat, + UINT32 Flags X2DEFAULT(0), + float MaxFrequencyRatio X2DEFAULT(XAUDIO2_DEFAULT_FREQ_RATIO), + IXAudio2VoiceCallback* pCallback X2DEFAULT(NULL), + const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(CreateSubmixVoice) (THIS_ IXAudio2SubmixVoice** ppSubmixVoice, + UINT32 InputChannels, UINT32 InputSampleRate, + UINT32 Flags X2DEFAULT(0), UINT32 ProcessingStage X2DEFAULT(0), + const XAUDIO2_VOICE_SENDS* pSendList X2DEFAULT(NULL), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(CreateMasteringVoice) (THIS_ IXAudio2MasteringVoice** ppMasteringVoice, + UINT32 InputChannels X2DEFAULT(XAUDIO2_DEFAULT_CHANNELS), + UINT32 InputSampleRate X2DEFAULT(XAUDIO2_DEFAULT_SAMPLERATE), + UINT32 Flags X2DEFAULT(0), UINT32 DeviceIndex X2DEFAULT(0), + const XAUDIO2_EFFECT_CHAIN* pEffectChain X2DEFAULT(NULL)) PURE; + STDMETHOD(StartEngine) (THIS) PURE; + STDMETHOD_(void, StopEngine) (THIS) PURE; + STDMETHOD(CommitChanges) (THIS_ UINT32 OperationSet) PURE; + STDMETHOD_(void, GetPerformanceData) (THIS_ XAUDIO2_PERFORMANCE_DATA* pPerfData) PURE; + STDMETHOD_(void, SetDebugConfiguration) (THIS_ const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration, + void* pReserved X2DEFAULT(NULL)) PURE; +}; + +__inline HRESULT XAudio2Create(IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0), + XAUDIO2_PROCESSOR XAudio2Processor X2DEFAULT(XAUDIO2_DEFAULT_PROCESSOR)) +{ + IXAudio2* pXAudio2; + HRESULT hr = CoCreateInstance((Flags & XAUDIO2_DEBUG_ENGINE) ? CLSID_XAudio2_Debug : CLSID_XAudio2, + NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2); + if (SUCCEEDED(hr)) + { + hr = pXAudio2->Initialize(Flags, XAudio2Processor); + if (SUCCEEDED(hr)) + { + *ppXAudio2 = pXAudio2; + } + else + { + pXAudio2->Release(); + } + } + return hr; +} +#endif diff --git a/ruby/input/directinput.cpp b/ruby/input/directinput.cpp index cb0da3c2..6db107b2 100755 --- a/ruby/input/directinput.cpp +++ b/ruby/input/directinput.cpp @@ -139,16 +139,16 @@ public: key(Keyboard::Period ) = (bool)(state[0x34] & 0x80); key(Keyboard::Slash ) = (bool)(state[0x35] & 0x80); - key(Keyboard::Keypad0) = (bool)(state[0x4f] & 0x80); - key(Keyboard::Keypad1) = (bool)(state[0x50] & 0x80); - key(Keyboard::Keypad2) = (bool)(state[0x51] & 0x80); - key(Keyboard::Keypad3) = (bool)(state[0x4b] & 0x80); - key(Keyboard::Keypad4) = (bool)(state[0x4c] & 0x80); - key(Keyboard::Keypad5) = (bool)(state[0x4d] & 0x80); - key(Keyboard::Keypad6) = (bool)(state[0x47] & 0x80); - key(Keyboard::Keypad7) = (bool)(state[0x48] & 0x80); - key(Keyboard::Keypad8) = (bool)(state[0x49] & 0x80); - key(Keyboard::Keypad9) = (bool)(state[0x52] & 0x80); + key(Keyboard::Keypad1) = (bool)(state[0x4f] & 0x80); + key(Keyboard::Keypad2) = (bool)(state[0x50] & 0x80); + key(Keyboard::Keypad3) = (bool)(state[0x51] & 0x80); + key(Keyboard::Keypad4) = (bool)(state[0x4b] & 0x80); + key(Keyboard::Keypad5) = (bool)(state[0x4c] & 0x80); + key(Keyboard::Keypad6) = (bool)(state[0x4d] & 0x80); + key(Keyboard::Keypad7) = (bool)(state[0x47] & 0x80); + key(Keyboard::Keypad8) = (bool)(state[0x48] & 0x80); + key(Keyboard::Keypad9) = (bool)(state[0x49] & 0x80); + key(Keyboard::Keypad0) = (bool)(state[0x52] & 0x80); key(Keyboard::Point ) = (bool)(state[0x53] & 0x80); key(Keyboard::Add ) = (bool)(state[0x4e] & 0x80); diff --git a/ruby/ruby.cpp b/ruby/ruby.cpp index 52395973..b52c63b1 100755 --- a/ruby/ruby.cpp +++ b/ruby/ruby.cpp @@ -194,6 +194,10 @@ void AudioInterface::driver(const char *driver) { else if(!strcmp(driver, "PulseAudioSimple")) p = new AudioPulseAudioSimple(); #endif + #ifdef AUDIO_XAUDIO2 + else if(!strcmp(driver, "XAudio2")) p = new AudioXAudio2(); + #endif + else p = new Audio(); } @@ -201,6 +205,8 @@ void AudioInterface::driver(const char *driver) { const char* AudioInterface::default_driver() { #if defined(AUDIO_DIRECTSOUND) return "DirectSound"; + #elif defined(AUDIO_XAUDIO2) + return "XAudio2"; #elif defined(AUDIO_ALSA) return "ALSA"; #elif defined(AUDIO_OPENAL) @@ -228,6 +234,10 @@ const char* AudioInterface::driver_list() { "DirectSound;" #endif + #if defined(AUDIO_XAUDIO2) + "XAudio2;" + #endif + //Linux #if defined(AUDIO_ALSA) @@ -298,10 +308,10 @@ void InputInterface::driver(const char *driver) { //select the *safest* available driver, not the fastest const char* InputInterface::default_driver() { - #if defined(INPUT_RAWINPUT) - return "RawInput"; - #elif defined(INPUT_DIRECTINPUT) + #if defined(INPUT_DIRECTINPUT) return "DirectInput"; + #elif defined(INPUT_RAWINPUT) + return "RawInput"; #elif defined(INPUT_SDL) return "SDL"; #elif defined(INPUT_X) diff --git a/ruby/ruby_impl.cpp b/ruby/ruby_impl.cpp index c2bdc2d1..4b7049e2 100755 --- a/ruby/ruby_impl.cpp +++ b/ruby/ruby_impl.cpp @@ -133,6 +133,10 @@ #include #endif +#ifdef AUDIO_XAUDIO2 + #include +#endif + /* Input */ #define DeclareInput(Name) \ diff --git a/snes/Makefile b/snes/Makefile index 06f9f91f..2a4b7fe3 100755 --- a/snes/Makefile +++ b/snes/Makefile @@ -10,14 +10,14 @@ snes_objects += snes-obc1 snes-st0010 snes-st0011 snes-st0018 snes_objects += snes-msu1 snes-serial objects += $(snes_objects) -ifeq ($(profile),research) - flags += -DPROFILE_RESEARCH +ifeq ($(profile),accuracy) + flags += -DPROFILE_ACCURACY snescpu := $(snes)/cpu snessmp := $(snes)/smp snesdsp := $(snes)/dsp snesppu := $(snes)/ppu -else ifeq ($(profile),baseline) - flags += -DPROFILE_BASELINE +else ifeq ($(profile),compatibility) + flags += -DPROFILE_COMPATIBILITY snescpu := $(snes)/cpu snessmp := $(snes)/smp snesdsp := $(snes)/fast/dsp diff --git a/snes/profile-research.hpp b/snes/profile-accuracy.hpp similarity index 54% rename from snes/profile-research.hpp rename to snes/profile-accuracy.hpp index ca1b8d75..006968cb 100755 --- a/snes/profile-research.hpp +++ b/snes/profile-accuracy.hpp @@ -1,6 +1,5 @@ namespace Info { - static const char Profile[] = "Research"; - static const char ProfileName[] = "Superfluous"; + static const char Profile[] = "Accuracy"; } #include diff --git a/snes/profile-baseline.hpp b/snes/profile-compatibility.hpp similarity index 55% rename from snes/profile-baseline.hpp rename to snes/profile-compatibility.hpp index 1ee4d403..2f551138 100755 --- a/snes/profile-baseline.hpp +++ b/snes/profile-compatibility.hpp @@ -1,6 +1,5 @@ namespace Info { - static const char Profile[] = "Baseline"; - static const char ProfileName[] = "Supersedence"; + static const char Profile[] = "Compatibility"; } #include diff --git a/snes/profile-performance.hpp b/snes/profile-performance.hpp index a0040af0..d43557d6 100755 --- a/snes/profile-performance.hpp +++ b/snes/profile-performance.hpp @@ -1,6 +1,5 @@ namespace Info { static const char Profile[] = "Performance"; - static const char ProfileName[] = "Supersonic"; } #include diff --git a/snes/snes.hpp b/snes/snes.hpp index 0ff0f13c..04c1a35c 100755 --- a/snes/snes.hpp +++ b/snes/snes.hpp @@ -1,7 +1,7 @@ namespace SNES { namespace Info { static const char Name[] = "bsnes"; - static const char Version[] = "067.21"; + static const char Version[] = "067.22"; static const unsigned SerializerVersion = 12; } } @@ -76,10 +76,10 @@ namespace SNES { #include #include - #if defined(PROFILE_RESEARCH) - #include "profile-research.hpp" - #elif defined(PROFILE_BASELINE) - #include "profile-baseline.hpp" + #if defined(PROFILE_ACCURACY) + #include "profile-accuracy.hpp" + #elif defined(PROFILE_COMPATIBILITY) + #include "profile-compatibility.hpp" #elif defined(PROFILE_PERFORMANCE) #include "profile-performance.hpp" #endif