From 454ca08025123322560e48dd2554185d0c42e0f5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Wed, 21 Jun 2017 23:43:11 -0400 Subject: [PATCH 01/15] Switch ColorChord over to the new dev esp82xx. --- embedded8266/ccconfig.h | 80 +++++------ embedded8266/esp82xx | 2 +- embedded8266/user.cfg | 9 +- embedded8266/user/custom_commands.c | 51 +++---- embedded8266/user/user_main.c | 70 ++++------ embedded8266/user/ws2812_i2s.h | 3 +- embedded8266/web/page/menuinterface.js | 185 +++++++++++++++++++++---- 7 files changed, 257 insertions(+), 143 deletions(-) diff --git a/embedded8266/ccconfig.h b/embedded8266/ccconfig.h index b3a09e5..b94ed85 100644 --- a/embedded8266/ccconfig.h +++ b/embedded8266/ccconfig.h @@ -12,52 +12,54 @@ #define memcpy ets_memcpy #define memset ets_memset -extern uint8_t gDFTIIR; //=6 -#define DFTIIR gDFTIIR - -extern uint8_t gFUZZ_IIR_BITS; //=1 -#define FUZZ_IIR_BITS gFUZZ_IIR_BITS - +#define ROOT_NOTE_OFFSET CCS.gROOT_NOTE_OFFSET +#define DFTIIR CCS.gDFTIIR +#define FUZZ_IIR_BITS CCS.gFUZZ_IIR_BITS #define MAXNOTES 12 //MAXNOTES cannot be changed dynamically. - -extern uint8_t gFILTER_BLUR_PASSES; //=2 -#define FILTER_BLUR_PASSES gFILTER_BLUR_PASSES - -extern uint8_t gSEMIBITSPERBIN; //=3 -#define SEMIBITSPERBIN gSEMIBITSPERBIN - -extern uint8_t gMAX_JUMP_DISTANCE; //=4 -#define MAX_JUMP_DISTANCE gMAX_JUMP_DISTANCE - -extern uint8_t gMAX_COMBINE_DISTANCE; //=7 -#define MAX_COMBINE_DISTANCE gMAX_COMBINE_DISTANCE - -extern uint8_t gAMP_1_IIR_BITS; //=4 -#define AMP_1_IIR_BITS gAMP_1_IIR_BITS - -extern uint8_t gAMP_2_IIR_BITS; //=2 -#define AMP_2_IIR_BITS gAMP_2_IIR_BITS - -extern uint8_t gMIN_AMP_FOR_NOTE; //=80 -#define MIN_AMP_FOR_NOTE gMIN_AMP_FOR_NOTE - -extern uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR; //=64 -#define MINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR - -extern uint8_t gNOTE_FINAL_AMP; //=12 -#define NOTE_FINAL_AMP gNOTE_FINAL_AMP - -extern uint8_t gNERF_NOTE_PORP; //=15 -#define NERF_NOTE_PORP gNERF_NOTE_PORP - -extern uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS -#define USE_NUM_LIN_LEDS gUSE_NUM_LIN_LEDS +#define FILTER_BLUR_PASSES CCS.gFILTER_BLUR_PASSES +#define SEMIBITSPERBIN CCS.gSEMIBITSPERBIN +#define MAX_JUMP_DISTANCE CCS.gMAX_JUMP_DISTANCE +#define MAX_COMBINE_DISTANCE CCS.gMAX_COMBINE_DISTANCE +#define AMP_1_IIR_BITS CCS.gAMP_1_IIR_BITS +#define AMP_2_IIR_BITS CCS.gAMP_2_IIR_BITS +#define MIN_AMP_FOR_NOTE CCS.gMIN_AMP_FOR_NOTE +#define MINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR +#define NOTE_FINAL_AMP CCS.gNOTE_FINAL_AMP +#define NERF_NOTE_PORP CCS.gNERF_NOTE_PORP +#define USE_NUM_LIN_LEDS CCS.gUSE_NUM_LIN_LEDS +#define COLORCHORD_OUTPUT_DRIVER CCS.gCOLORCHORD_OUTPUT_DRIVER +#define COLORCHORD_ACTIVE CCS.gCOLORCHORD_ACTIVE //We are not enabling these for the ESP8266 port. #define LIN_WRAPAROUND 0 #define SORT_NOTES 0 +struct CCSettings +{ + uint8_t gSETTINGS_KEY; + uint8_t gROOT_NOTE_OFFSET; //Set to define what the root note is. 0 = A. + uint8_t gDFTIIR; //=6 + uint8_t gFUZZ_IIR_BITS; //=1 + uint8_t gFILTER_BLUR_PASSES; //=2 + uint8_t gSEMIBITSPERBIN; //=3 + uint8_t gMAX_JUMP_DISTANCE; //=4 + uint8_t gMAX_COMBINE_DISTANCE; //=7 + uint8_t gAMP_1_IIR_BITS; //=4 + uint8_t gAMP_2_IIR_BITS; //=2 + uint8_t gMIN_AMP_FOR_NOTE; //=80 + uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR; //=64 + uint8_t gNOTE_FINAL_AMP; //=12 + uint8_t gNERF_NOTE_PORP; //=15 + uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS + uint8_t gCOLORCHORD_ACTIVE; + uint8_t gCOLORCHORD_OUTPUT_DRIVER; +}; + +extern struct CCSettings CCS; + + + #endif diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 113e0d1..21e23b5 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 113e0d1a182cd138510f748abf2854c0e84cfa23 +Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 diff --git a/embedded8266/user.cfg b/embedded8266/user.cfg index 5945534..4677ca8 100644 --- a/embedded8266/user.cfg +++ b/embedded8266/user.cfg @@ -12,12 +12,17 @@ PAGE_OFFSET = 65536 # 1048576 #SDK_DEFAULT = $(HOME)/esp8266/esp-open-sdk ESP_GCC_VERS = 4.8.5 -SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 +#SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 PAGE_SCRIPTS = main.js -FWBURNFLAGS = -b 1000000 +FWBURNFLAGS = -b 1500000 OPTS += -DICACHE_FLASH +OPTS += -DDISABLE_CHARRX #Saves about 48 bytes. +OPTS += -DQUIET_REFLASH #Saves about 128 bytes. +OPTS += -DWS2812_FOUR_SAMPLE #Saves about 224 bytes. +#OPTS += -DWS2812_THREE_SAMPLE + #OPTS += -DVERIFY_FLASH_WRITE #OPTS += -DDEBUG #OPTS += -DFREQ=12500 diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 3afe2ef..be53a79 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -4,6 +4,7 @@ #include #include "esp82xxutil.h" #include +#include #include #include @@ -13,34 +14,21 @@ extern volatile uint16_t soundhead; #define CONFIGURABLES 17 //(plus1) -extern uint8_t RootNoteOffset; //Set to define what the root note is. 0 = A. -uint8_t gDFTIIR = 6; -uint8_t gFUZZ_IIR_BITS = 1; -uint8_t gFILTER_BLUR_PASSES = 2; -uint8_t gSEMIBITSPERBIN = 3; -uint8_t gMAX_JUMP_DISTANCE = 4; -uint8_t gMAX_COMBINE_DISTANCE = 7; -uint8_t gAMP_1_IIR_BITS = 4; -uint8_t gAMP_2_IIR_BITS = 2; -uint8_t gMIN_AMP_FOR_NOTE = 80; -uint8_t gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR = 64; -uint8_t gNOTE_FINAL_AMP = 12; -uint8_t gNERF_NOTE_PORP = 15; -uint8_t gUSE_NUM_LIN_LEDS = NUM_LIN_LEDS; -uint8_t gCOLORCHORD_ACTIVE = 1; -uint8_t gCOLORCHORD_OUTPUT_DRIVER = 0; struct SaveLoad { uint8_t configs[CONFIGURABLES]; + uint8_t SaveLoadKey; //Must be 0xaa to be valid. } settings; +struct CCSettings CCS; + uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 0 }; -uint8_t * gConfigurables[CONFIGURABLES] = { &RootNoteOffset, &gDFTIIR, &gFUZZ_IIR_BITS, &gFILTER_BLUR_PASSES, - &gSEMIBITSPERBIN, &gMAX_JUMP_DISTANCE, &gMAX_COMBINE_DISTANCE, &gAMP_1_IIR_BITS, - &gAMP_2_IIR_BITS, &gMIN_AMP_FOR_NOTE, &gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &gNOTE_FINAL_AMP, - &gNERF_NOTE_PORP, &gUSE_NUM_LIN_LEDS, &gCOLORCHORD_ACTIVE, &gCOLORCHORD_OUTPUT_DRIVER, 0 }; +uint8_t * gConfigurables[CONFIGURABLES] = { &CCS.gROOT_NOTE_OFFSET, &CCS.gDFTIIR, &CCS.gFUZZ_IIR_BITS, &CCS.gFILTER_BLUR_PASSES, + &CCS.gSEMIBITSPERBIN, &CCS.gMAX_JUMP_DISTANCE, &CCS.gMAX_COMBINE_DISTANCE, &CCS.gAMP_1_IIR_BITS, + &CCS.gAMP_2_IIR_BITS, &CCS.gMIN_AMP_FOR_NOTE, &CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &CCS.gNOTE_FINAL_AMP, + &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, 0 }; char * gConfigurableNames[CONFIGURABLES] = { "gROOT_NOTE_OFFSET", "gDFTIIR", "gFUZZ_IIR_BITS", "gFILTER_BLUR_PASSES", "gSEMIBITSPERBIN", "gMAX_JUMP_DISTANCE", "gMAX_COMBINE_DISTANCE", "gAMP_1_IIR_BITS", @@ -51,11 +39,24 @@ void ICACHE_FLASH_ATTR CustomStart( ) { int i; spi_flash_read( 0x3D000, (uint32*)&settings, sizeof( settings ) ); - for( i = 0; i < CONFIGURABLES; i++ ) + if( settings.SaveLoadKey == 0xaa ) { - if( gConfigurables[i] ) + for( i = 0; i < CONFIGURABLES; i++ ) { - *gConfigurables[i] = settings.configs[i]; + if( gConfigurables[i] ) + { + *gConfigurables[i] = settings.configs[i]; + } + } + } + else + { + for( i = 0; i < CONFIGURABLES; i++ ) + { + if( gConfigurables[i] ) + { + *gConfigurables[i] = gConfigDefaults[i]; + } } } } @@ -105,8 +106,8 @@ int ICACHE_FLASH_ATTR CustomCommand(char * buffer, int retsize, char *pusrdata, case 'l': case 'L': //LEDs { int i, it = 0; - buffend += ets_sprintf( buffend, "CL\t%d\t", gUSE_NUM_LIN_LEDS ); - uint16_t toledsvals = gUSE_NUM_LIN_LEDS*3; + buffend += ets_sprintf( buffend, "CL\t%d\t", USE_NUM_LIN_LEDS ); + uint16_t toledsvals = USE_NUM_LIN_LEDS*3; if( toledsvals > 600 ) toledsvals = 600; for( i = 0; i < toledsvals; i++ ) { diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 3b858e7..a67aa40 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -15,9 +15,10 @@ #include "ccconfig.h" #include #include +#include #include "ets_sys.h" #include "gpio.h" - +#include "settings.h" //#define PROFILE #define PORT 7777 @@ -28,6 +29,7 @@ #define procTaskPrio 0 #define procTaskQueueLen 1 +struct CCSettings CCS; static volatile os_timer_t some_timer; static struct espconn *pUdpServer; @@ -37,27 +39,26 @@ void ExitCritical(); extern volatile uint8_t sounddata[HPABUFFSIZE]; extern volatile uint16_t soundhead; uint16_t soundtail; -extern uint8_t gCOLORCHORD_ACTIVE; -static uint8_t hpa_running = 0; +static uint8_t hpa_running = 0; +static uint8_t hpa_is_paused_for_wifi; void ICACHE_FLASH_ATTR CustomStart( ); void ICACHE_FLASH_ATTR user_rf_pre_init() { } -extern uint8_t gCOLORCHORD_OUTPUT_DRIVER; //Call this once we've stacked together one full colorchord frame. static void NewFrame() { - if( !gCOLORCHORD_ACTIVE ) return; + if( !COLORCHORD_ACTIVE ) return; //uint8_t led_outs[NUM_LIN_LEDS*3]; int i; HandleFrameInfo(); - switch( gCOLORCHORD_OUTPUT_DRIVER ) + switch( COLORCHORD_OUTPUT_DRIVER ) { case 0: UpdateLinearLEDs(); @@ -72,56 +73,22 @@ static void NewFrame() } os_event_t procTaskQueue[procTaskQueueLen]; -static uint8_t printed_ip = 0; uint32_t samp_iir = 0; int wf = 0; //Tasks that happen all the time. -static void ICACHE_FLASH_ATTR HandleIPStuff() -{ - //Idle Event. - struct station_config wcfg; - char stret[256]; - char *stt = &stret[0]; - struct ip_info ipi; - - int stat = wifi_station_get_connect_status(); - - //printf( "STAT: %d %d\n", stat, wifi_get_opmode() ); - - if( stat == STATION_WRONG_PASSWORD || stat == STATION_NO_AP_FOUND || stat == STATION_CONNECT_FAIL ) - { - wifi_set_opmode_current( 2 ); - stt += ets_sprintf( stt, "Connection failed: %d\n", stat ); - uart0_sendStr(stret); - } - - if( stat == STATION_GOT_IP && !printed_ip ) - { - wifi_station_get_config( &wcfg ); - wifi_get_ip_info(0, &ipi); - stt += ets_sprintf( stt, "STAT: %d\n", stat ); - stt += ets_sprintf( stt, "IP: %d.%d.%d.%d\n", (ipi.ip.addr>>0)&0xff,(ipi.ip.addr>>8)&0xff,(ipi.ip.addr>>16)&0xff,(ipi.ip.addr>>24)&0xff ); - stt += ets_sprintf( stt, "NM: %d.%d.%d.%d\n", (ipi.netmask.addr>>0)&0xff,(ipi.netmask.addr>>8)&0xff,(ipi.netmask.addr>>16)&0xff,(ipi.netmask.addr>>24)&0xff ); - stt += ets_sprintf( stt, "GW: %d.%d.%d.%d\n", (ipi.gw.addr>>0)&0xff,(ipi.gw.addr>>8)&0xff,(ipi.gw.addr>>16)&0xff,(ipi.gw.addr>>24)&0xff ); - stt += ets_sprintf( stt, "WCFG: /%s/%s/\n", wcfg.ssid, wcfg.password ); - uart0_sendStr(stret); - printed_ip = 1; - } -} - static void procTask(os_event_t *events) { system_os_post(procTaskPrio, 0, 0 ); - if( gCOLORCHORD_ACTIVE && !hpa_running ) + if( COLORCHORD_ACTIVE && !hpa_running ) { ExitCritical(); hpa_running = 1; } - if( !gCOLORCHORD_ACTIVE && hpa_running ) + if( !COLORCHORD_ACTIVE && hpa_running ) { EnterCritical(); hpa_running = 0; @@ -152,7 +119,6 @@ static void procTask(os_event_t *events) if( events->sig == 0 && events->par == 0 ) { CSTick( 0 ); - HandleIPStuff(); } } @@ -161,6 +127,12 @@ static void procTask(os_event_t *events) static void ICACHE_FLASH_ATTR myTimer(void *arg) { CSTick( 1 ); + + if( hpa_is_paused_for_wifi && printed_ip ) + { + StartHPATimer(); //Init the high speed ADC timer. + hpa_running = 1; + } // uart0_sendStr("."); // printf( "%d/%d\n",soundtail,soundhead ); // printf( "%d/%d\n",soundtail,soundhead ); @@ -238,8 +210,16 @@ void ICACHE_FLASH_ATTR user_init(void) InitColorChord(); //Init colorchord - StartHPATimer(); //Init the high speed ADC timer. - hpa_running = 1; + //Tricky: If we are in station mode, wait for that to get resolved before enabling the high speed timer. + if( wifi_get_opmode() == 1 ) + { + hpa_is_paused_for_wifi = 1; + } + else + { + StartHPATimer(); //Init the high speed ADC timer. + hpa_running = 1; + } ws2812_init(); diff --git a/embedded8266/user/ws2812_i2s.h b/embedded8266/user/ws2812_i2s.h index 85609d7..c0276e6 100644 --- a/embedded8266/user/ws2812_i2s.h +++ b/embedded8266/user/ws2812_i2s.h @@ -23,7 +23,8 @@ //4 takes up more RAM per LED than 3. //3 has slightly more restrictve timing requirements. //4 has more DMA load when running. -#define WS2812_THREE_SAMPLE + +//#define WS2812_THREE_SAMPLE //#define WS2812_FOUR_SAMPLE void ICACHE_FLASH_ATTR ws2812_init(); diff --git a/embedded8266/web/page/menuinterface.js b/embedded8266/web/page/menuinterface.js index 21cca02..ea3aea0 100644 --- a/embedded8266/web/page/menuinterface.js +++ b/embedded8266/web/page/menuinterface.js @@ -6,7 +6,7 @@ var output; var websocket; var commsup = 0; -var mpfs_start_at = 1048576; +var mpfs_start_at = 65536; //1048576; NOTE: If you select 1048576, it will override the 65536 sector, but has much more room. var flash_scratchpad_at = 524288; var flash_blocksize = 65536; var flash_sendsize = 256; @@ -44,10 +44,12 @@ function QueueOperation( command, callback ) workqueue.push( vp ); } - +did_init = false; function init() { - var GPIOlines = ''; + if( did_init ) return; + did_init = true; + GPIOlines = ''; for(var i=0; i<16; ++i) GPIOlines += ""+ i + "" @@ -56,10 +58,11 @@ function init() $('#MainMenu > tbody:first-child').before( "\ \ - \ + \
\
\ -
\n
" ); +
\n " + ); $('#MainMenu > tbody:last-child').after( "\ \ @@ -118,16 +121,19 @@ function init() $("#custom_command_response").val( "" ); //Preclude drag and drop on rest of document in event user misses firmware boxes. - var donothing = function(e) {e.stopPropagation();e.preventDefault();}; + donothing = function(e) {e.stopPropagation();e.preventDefault();}; $(document).on('drop', donothing ); $(document).on('dragover', donothing ); $(document).on('dragenter', donothing ); output = document.getElementById("output"); - Ticker(); KickWifiTicker(); GPIODataTickerStart(); + InitSystemTicker(); + + console.log( "Load complete.\n" ); + Ticker(); } window.addEventListener("load", init, false); @@ -141,6 +147,7 @@ function StartWebSocket() workqueue = []; lastitem = null; websocket = new WebSocket(wsUri); + websocket.binaryType = 'arraybuffer'; websocket.onopen = function(evt) { onOpen(evt) }; websocket.onclose = function(evt) { onClose(evt) }; websocket.onmessage = function(evt) { onMessage(evt) }; @@ -161,7 +168,8 @@ function onClose(evt) var msg = 0; var tickmessage = 0; var lasthz = 0; -var time_since_hz = 0; +var time_since_hz = 10; //Make it realize it was disconnected to begin with. + function Ticker() { setTimeout( Ticker, 1000 ); @@ -203,17 +211,24 @@ function onMessage(evt) } + var rawdat = new Uint8Array(evt.data) + var stringdata = String.fromCharCode.apply(null, rawdat); + if( lastitem ) { if( lastitem.callback ) { - lastitem.callback( lastitem, evt.data ); + lastitem.callback( lastitem, stringdata, rawdat ); lastitem = null; } } else { - output.innerHTML = "

Messages: " + msg + "

RSSI: " + evt.data.substr(2) + "

"; + if( stringdata.length > 2 ) + { + var wxresp = stringdata.substr(2).split("\t"); + output.innerHTML = "

Messages: " + msg + "

RSSI: " + wxresp[0] + " / IP: " + ((wxresp.length>1)?HexToIP( wxresp[1] ):"") + "

"; + } } @@ -278,27 +293,27 @@ function IssueCustomCommand() function MakeDragDrop( divname, callback ) { var obj = $("#" + divname); - obj.on('dragenter', function (e) + obj.on('dragenter', function (e) { e.stopPropagation(); e.preventDefault(); $(this).css('border', '2px solid #0B85A1'); }); - obj.on('dragover', function (e) + obj.on('dragover', function (e) { e.stopPropagation(); e.preventDefault(); }); - obj.on('dragend', function (e) + obj.on('dragend', function (e) { e.stopPropagation(); e.preventDefault(); $(this).css('border', '2px dotted #0B85A1'); }); - obj.on('drop', function (e) + obj.on('drop', function (e) { $(this).css('border', '2px dotted #0B85A1'); e.preventDefault(); @@ -318,9 +333,108 @@ function MakeDragDrop( divname, callback ) /////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///Below here are mostly just events... -var did_wifi_get_config = false; -var is_data_ticker_running = false; -var is_waiting_on_stations = false; +var sysset = null; +var snchanged = false; +var sdchanged = false; + +var lastpeerdata = ""; + +function CallbackForPeers(req,data) +{ + if( data == lastpeerdata ) return; + lastpeerdata = data; + var lines = data.split( "\n" ); + var searchcount = 0; + if( lines.length > 0 ) + { + var line1 = lines[0].split( "\t" ); + if( line1.length > 1 ) searchcount = Number( line1[1] ); + } + + var htm = ""; + for( var i = 1; i < lines.length; i++ ) + { + var elems = lines[i].split( "\t" ); + if( elems.length < 4 ) continue; + IP = HexToIP( elems[0] ); + + htm += ""; + } + htm += "
AddressServiceNameDescription
" + IP + "" + elems[1] + "" + elems[2] + "" + elems[3] + "
"; + if( searchcount == 0 ) + { + htm += ""; + } + + $("#peers").html( htm ); +} + +function SysTickBack(req,data) +{ + var params = data.split( "\t" ); + if( !snchanged ) + { + $("#SystemName").prop( "value", params[3] ); + $("#SystemName").removeClass( "unsaved-input"); + } + if( !sdchanged ) + { + $("#SystemDescription").prop( "value", params[4] ); + $("#SystemDescription").removeClass( "unsaved-input"); + } + $("#ServiceName").html( params[5] ); + $("#FreeHeap").html( params[6] ); + + QueueOperation( "BL", CallbackForPeers ); +} + +function SystemInfoTick() +{ + if( IsTabOpen('SystemStatus') ) + { + QueueOperation( "I", SysTickBack ); + setTimeout( SystemInfoTick, 500 ); + } + else + { + //Stop. + } +} + +function SystemChangesReset() +{ + snchanged = false; + sdchanged = false; +} + +function SystemUncommittedChanges() +{ + if( sdchanged || snchanged ) return true; + else return false; +} + +function InitSystemTicker() +{ + sysset = document.getElementById( "systemsettings" ); + SystemInfoTick(); + sysset.innerHTML = "\ +
System Name:
System Description:
Service Name:
Free Heap:
\ + \ + \ + \ + \ + \ +

Search for others:

\ +
"; + $("#SystemName").on("input propertychange paste",function(){snchanged = true; $("#SystemName").addClass( "unsaved-input"); }); + $("#SystemDescription").on("input propertychange paste",function(){sdchanged = true;$("#SystemDescription").addClass( "unsaved-input"); }); +} + + + +did_wifi_get_config = false; +is_data_ticker_running = false; +is_waiting_on_stations = false; function ScanForWifi() { @@ -378,7 +492,7 @@ function WifiDataTicker() QueueOperation( "WI", function(req,data) { var params = data.split( "\t" ); - + var opmode = Number( params[0].substr(2) ); document.wifisection.wifitype.value = opmode; document.wifisection.wificurname.value = params[1]; @@ -394,6 +508,7 @@ function WifiDataTicker() QueueOperation( "WR", function(req,data) { var lines = data.split( "\n" ); var innerhtml; + if( data[0] == '!' ) return; //If no APs, don't deal with list. if( lines.length < 3 ) { @@ -425,7 +540,7 @@ function WifiDataTicker() innerhtml += ""; document.getElementById("WifiStations").innerHTML = innerhtml; } ); - setTimeout( WifiDataTicker, 12000 ); + setTimeout( WifiDataTicker, 500 ); } else { @@ -435,7 +550,7 @@ function WifiDataTicker() function ChangeWifiConfig() { - + var st = "W"; st += document.wifisection.wifitype.value; st += "\t" + document.wifisection.wificurname.value; @@ -549,7 +664,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) pushop.ctx.file1md5 = faultylabs.MD5( pushop.paddata ).toLowerCase(); var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { $("#innersystemflashtext").html( "Pusing second half..." ); PushImageTo( e.target.result, flash_scratchpad_at + 0x40000, SystemPushImageProgress, pushop.ctx ); } @@ -567,7 +682,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) var stf = "FM" + flash_scratchpad_at + "\t0\t" + f1s + "\t" + f1m + "\t" + (flash_scratchpad_at+0x40000) + "\t" + 0x40000 + "\t" + f2s + "\t" + f2m + "\n"; var fun = function( fsrd, flashresponse ) { $("#innerflashtext").html( (flashresponse[0] == '!')?"Flashing failed.":"Flash success." ) }; - QueueOperation( stf, fun); + QueueOperation( stf, fun); } return false; @@ -578,7 +693,7 @@ function SystemPushImageProgress( is_ok, comment, pushop ) function WebPagePushImageFunction( ok, comment, pushop ) -{ +{ if( pushop.place == pushop.padlen ) { $("#innersystemflashtext").html("Push complete. Reload page."); @@ -589,7 +704,7 @@ function WebPagePushImageFunction( ok, comment, pushop ) } return true; -} +} function DragDropSystemFiles( file ) { @@ -607,7 +722,7 @@ function DragDropSystemFiles( file ) var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { PushImageTo( e.target.result, mpfs_start_at, WebPagePushImageFunction ); } @@ -620,18 +735,19 @@ function DragDropSystemFiles( file ) for( var i = 0; i < file.length; i++ ) { - if( file[i].name.substr( 0, 7 ) == "0x00000" ) file1 = file[i]; - if( file[i].name.substr( 0, 7 ) == "0x40000" ) file2 = file[i]; + console.log( "Found: " + file[i].name ); + if( file[i].name.substr( 0, 17 ) == "image.elf-0x00000" ) file1 = file[i]; + if( file[i].name.substr( 0, 17 ) == "image.elf-0x40000" ) file2 = file[i]; } if( !file1 ) { - $("#innersystemflashtext").html( "Could not find a 0x00000... file." ); return; + $("#innersystemflashtext").html( "Could not find a image.elf-0x00000... file." ); return; } if( !file2 ) { - $("#innersystemflashtext").html( "Could not find a 0x40000... file." ); return; + $("#innersystemflashtext").html( "Could not find a image.elf-0x40000... file." ); return; } if( file1.size > 65536 ) @@ -650,7 +766,7 @@ function DragDropSystemFiles( file ) var reader = new FileReader(); - reader.onload = function(e) { + reader.onload = function(e) { var ctx = new Object(); ctx.file1 = file1; ctx.file2 = file2; @@ -682,6 +798,15 @@ function tohex8( c ) } +function HexToIP( hexstr ) +{ + if( !hexstr ) return ""; + return parseInt( hexstr.substr( 6, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 4, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 2, 2 ), 16 ) + "." + + parseInt( hexstr.substr( 0, 2 ), 16 ); +} + function ContinueSystemFlash( fsrd, flashresponse, pushop ) { if( flashresponse[0] == '!' ) From faa72a488b9d346a1bc1957315a2b16a66bcb9cf Mon Sep 17 00:00:00 2001 From: cnlohr Date: Wed, 21 Jun 2017 23:55:03 -0400 Subject: [PATCH 02/15] forgot to set key on save. --- embedded8266/user/custom_commands.c | 1 + 1 file changed, 1 insertion(+) diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index be53a79..62d0ab4 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -199,6 +199,7 @@ int ICACHE_FLASH_ATTR CustomCommand(char * buffer, int retsize, char *pusrdata, if( gConfigurables[i] ) settings.configs[i] = *gConfigurables[i]; } + settings.SaveLoadKey = 0xAA; EnterCritical(); ets_intr_lock(); From 095ca6d4152cc74c61db0bcc8feefc2b76865fef Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sat, 24 Jun 2017 02:13:01 -0400 Subject: [PATCH 03/15] remove unused references to settings.h --- embedded8266/user/custom_commands.c | 1 - embedded8266/user/user_main.c | 1 - 2 files changed, 2 deletions(-) diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 62d0ab4..6832a76 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -4,7 +4,6 @@ #include #include "esp82xxutil.h" #include -#include #include #include diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index a67aa40..5b5267b 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -18,7 +18,6 @@ #include #include "ets_sys.h" #include "gpio.h" -#include "settings.h" //#define PROFILE #define PORT 7777 From 4dc15e13e2632028fc7f214aa79e3a55f8b3866f Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sat, 8 Jul 2017 16:58:41 -0400 Subject: [PATCH 04/15] add hidapistuff --- colorchord2/DisplayHIDAPI.c | 242 +++ colorchord2/Makefile | 8 +- colorchord2/hidapi.c | 2918 +++++++++++++++++++++++++++++++++++ colorchord2/hidapi.conf | 30 + colorchord2/hidapi.h | 405 +++++ 5 files changed, 3599 insertions(+), 4 deletions(-) create mode 100644 colorchord2/DisplayHIDAPI.c create mode 100644 colorchord2/hidapi.c create mode 100644 colorchord2/hidapi.conf create mode 100644 colorchord2/hidapi.h diff --git a/colorchord2/DisplayHIDAPI.c b/colorchord2/DisplayHIDAPI.c new file mode 100644 index 0000000..40792a1 --- /dev/null +++ b/colorchord2/DisplayHIDAPI.c @@ -0,0 +1,242 @@ +//Copyright 2015 <>< Charles Lohr under the ColorChord License. + +#include "outdrivers.h" +#include "notefinder.h" +#include +#include +#include "parameters.h" +#include +#include "hidapi.h" +#include "color.h" +#include +#include + +struct HIDAPIOutDriver +{ + hid_device *devh; + int did_init; + int zigzag; + int total_leds; + int array; + float outamp; + uint8_t * last_leds; + int buffersize; + volatile int readyFlag; + int xn; + int yn; + int rot90; + int is_rgby; + int bank_size[4]; + int bank_id[4]; +}; + + +static void * LEDOutThread( void * v ) +{ + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)v; + while(1) + { + int total_bytes = led->buffersize; + total_bytes = ((total_bytes-2)&0xffc0) + 0x41; //Round up. + if( led->readyFlag ) + { +/* + int i; + printf( "%d -- ", total_bytes ); + for( i = 0; i < total_bytes; i++ ) + { + if( !( i & 0x0f ) ) printf( "\n" ); + printf( "%02x ", led->last_leds[i] ); + } + printf( "\n" ); +*/ + int r = hid_send_feature_report( led->devh, led->last_leds, total_bytes ); + if( r < 0 ) + { + led->did_init = 0; + printf( "Fault sending LEDs.\n" ); + } + led->readyFlag = 0; + } + usleep(100); + } + return 0; +} + +static void LEDUpdate(void * id, struct NoteFinder*nf) +{ + int i; + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)id; + + + if( !led->did_init ) + { + led->did_init = 1; + hid_init(); + + led->devh = hid_open( 0xabcd, 0xf104, 0 ); + + if( !led->devh ) + { + fprintf( stderr, "Error: Cannot find device.\n" ); +// exit( -98 ); + } + } + + int leds_this_round = 0; + int ledbid = 0; + + while( led->readyFlag ) usleep(100); + + int lastledplace = 1; + led->last_leds[0] = 0; + + int k = 0; + + //Advance the LEDs to this position when outputting the values. + for( i = 0; i < led->total_leds; i++ ) + { + int source = i; + if( !led->array ) + { + int sx, sy; + if( led->rot90 ) + { + sy = i % led->yn; + sx = i / led->yn; + } + else + { + sx = i % led->xn; + sy = i / led->xn; + } + + if( led->zigzag ) + { + if( led->rot90 ) + { + if( sx & 1 ) + { + sy = led->yn - sy - 1; + } + } + else + { + if( sy & 1 ) + { + sx = led->xn - sx - 1; + } + } + } + + if( led->rot90 ) + { + source = sx + sy * led->xn; + } + else + { + source = sx + sy * led->yn; + } + } + + + if( led->is_rgby ) + { + int r = OutLEDs[k++]; + int g = OutLEDs[k++]; + int b = OutLEDs[k++]; + int y = 0; + int rg_common; + if( r/2 > g ) rg_common = g; + else rg_common = r/2; + + if( rg_common > 255 ) rg_common = 255; + y = rg_common; + r -= rg_common; + g -= rg_common; + if( r < 0 ) r = 0; + if( g < 0 ) g = 0; + + + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = g * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = r * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = b * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = y * led->outamp; + } + else + { + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+1] * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+0] * led->outamp; + if( (lastledplace % 64) == 1 ) led->last_leds[lastledplace++] = led->bank_id[ledbid]; + led->last_leds[lastledplace++] = OutLEDs[source*3+2] * led->outamp; + } + //printf( "%3d -- %3d [%3d] == %d %d %d\n", ledbid, source, lastledplace, OutLEDs[source*3+1], OutLEDs[source*3+0], OutLEDs[source*3+2] ); + leds_this_round++; + while( leds_this_round >= led->bank_size[ledbid] ) + { + while( (lastledplace % 64) != 1 ) led->last_leds[lastledplace++] = 0; + ledbid++; + if( ledbid > 3 ) break; + if( led->bank_size[ledbid] != 0 ) + led->last_leds[lastledplace++] = led->bank_id[ledbid]; + else + continue; + leds_this_round = 0; + } + if( ledbid > 3 ) break; + } + led->buffersize = lastledplace; + + led->readyFlag = 1; +} + +static void LEDParams(void * id ) +{ + struct HIDAPIOutDriver * led = (struct HIDAPIOutDriver*)id; + + led->total_leds = GetParameterI( "leds", 300 ); + led->last_leds = malloc( led->total_leds * 5 + 4 ); + led->outamp = .1; RegisterValue( "ledoutamp", PAFLOAT, &led->outamp, sizeof( led->outamp ) ); + led->zigzag = 0; RegisterValue( "zigzag", PAINT, &led->zigzag, sizeof( led->zigzag ) ); + led->xn = 16; RegisterValue( "lightx", PAINT, &led->xn, sizeof( led->xn ) ); + led->yn = 9; RegisterValue( "lighty", PAINT, &led->yn, sizeof( led->yn ) ); + led->rot90 = 0; RegisterValue( "rot90", PAINT, &led->rot90, sizeof( led->rot90 ) ); + led->array = 0; RegisterValue( "ledarray", PAINT, &led->array, sizeof( led->array ) ); + led->is_rgby = 0; RegisterValue( "ledisrgby", PAINT, &led->is_rgby, sizeof( led->is_rgby ) ); + + led->bank_size[0] = 0; RegisterValue( "bank1_size", PAINT, &led->bank_size[0], sizeof( led->bank_size[0] ) ); + led->bank_size[1] = 0; RegisterValue( "bank2_size", PAINT, &led->bank_size[1], sizeof( led->bank_size[1] ) ); + led->bank_size[2] = 0; RegisterValue( "bank3_size", PAINT, &led->bank_size[2], sizeof( led->bank_size[2] ) ); + led->bank_size[3] = 0; RegisterValue( "bank4_size", PAINT, &led->bank_size[3], sizeof( led->bank_size[3] ) ); + led->bank_id[0] = 0; RegisterValue( "bank1_id", PAINT, &led->bank_id[0], sizeof( led->bank_id[0] ) ); + led->bank_id[1] = 0; RegisterValue( "bank2_id", PAINT, &led->bank_id[1], sizeof( led->bank_id[1] ) ); + led->bank_id[2] = 0; RegisterValue( "bank3_id", PAINT, &led->bank_id[2], sizeof( led->bank_id[2] ) ); + led->bank_id[3] = 0; RegisterValue( "bank4_id", PAINT, &led->bank_id[3], sizeof( led->bank_id[3] ) ); + + led->did_init = 0; +} + + +static struct DriverInstances * DisplayHIDAPI() +{ + struct DriverInstances * ret = malloc( sizeof( struct DriverInstances ) ); + memset( ret, 0, sizeof( struct DriverInstances ) ); + struct HIDAPIOutDriver * led = ret->id = malloc( sizeof( struct HIDAPIOutDriver ) ); + ret->Func = LEDUpdate; + ret->Params = LEDParams; + OGCreateThread( LEDOutThread, led ); + led->readyFlag = 0; + LEDParams( led ); + return ret; + +} + +REGISTER_OUT_DRIVER(DisplayHIDAPI); + + diff --git a/colorchord2/Makefile b/colorchord2/Makefile index e1c9ad3..5a7c35b 100644 --- a/colorchord2/Makefile +++ b/colorchord2/Makefile @@ -3,14 +3,14 @@ all : colorchord RAWDRAW:=DrawFunctions.o XDriver.o SOUND:=sound.o sound_alsa.o sound_pulse.o sound_null.o -OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o OutputCells.o +OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o WINGCC:= i686-w64-mingw32-gcc WINGCCFLAGS:= -g -DICACHE_FLASH_ATTR= -I../embeddedcommon -I. -O1 #-O2 -Wl,--relax -Wl,--gc-sections -ffunction-sections -fdata-sections -WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 +WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 -lsetupapi RAWDRAWLIBS:=-lX11 -lm -lpthread -lXinerama -lXext -LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse +LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev CFLAGS:=-g -Os -flto -Wall -ffast-math -I../embeddedcommon -I. -DICACHE_FLASH_ATTR= @@ -19,7 +19,7 @@ EXTRALIBS:=-lusb-1.0 colorchord : os_generic.o main.o dft.o decompose.o filter.o color.o notefinder.o util.o outdrivers.o $(RAWDRAW) $(SOUND) $(OUTS) parameters.o chash.o hook.o ../embeddedcommon/DFT32.o configs.o gcc -o $@ $^ $(CFLAGS) $(LDLIBS) $(EXTRALIBS) $(RAWDRAWLIBS) -colorchord.exe : os_generic.c main.c dft.c decompose.c filter.c color.c notefinder.c util.c outdrivers.c DrawFunctions.c parameters.c chash.c WinDriver.c sound.c sound_null.c sound_win.c OutputVoronoi.c DisplayArray.c OutputLinear.c DisplayPie.c DisplayNetwork.c hook.c RecorderPlugin.c ../embeddedcommon/DFT32.c OutputCells.c configs.c +colorchord.exe : os_generic.c main.c dft.c decompose.c filter.c color.c notefinder.c util.c outdrivers.c DrawFunctions.c parameters.c chash.c WinDriver.c sound.c sound_null.c sound_win.c OutputVoronoi.c DisplayArray.c OutputLinear.c DisplayPie.c DisplayNetwork.c hook.c RecorderPlugin.c ../embeddedcommon/DFT32.c OutputCells.c configs.c hidapi.c DisplayHIDAPI.c $(WINGCC) $(WINGCCFLAGS) -o $@ $^ $(WINLDFLAGS) diff --git a/colorchord2/hidapi.c b/colorchord2/hidapi.c new file mode 100644 index 0000000..ceb7832 --- /dev/null +++ b/colorchord2/hidapi.c @@ -0,0 +1,2918 @@ +#ifdef _WIN32 + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + + +/* Copy of LICENSE-orig.txt (compatible with MIT/x11 license) + + HIDAPI - Multi-Platform library for + communication with HID devices. + + Copyright 2009, Alan Ott, Signal 11 Software. + All Rights Reserved. + + This software may be used by anyone for any reason so + long as the copyright notice in the source files + remains intact. +*/ + +#include + +#ifndef _NTDEF_ +typedef LONG NTSTATUS; +#endif + +#ifdef __MINGW32__ +#include +#include +#endif + +#ifdef __CYGWIN__ +#include +#define _wcsdup wcsdup +#endif + +/* The maximum number of characters that can be passed into the + HidD_Get*String() functions without it failing.*/ +#define MAX_STRING_WCHARS 0xFFF + +/*#define HIDAPI_USE_DDK*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef TCC + typedef struct _SP_DEVINFO_DATA { + DWORD cbSize; + GUID ClassGuid; + DWORD DevInst; + ULONG_PTR Reserved; + } SP_DEVINFO_DATA, *PSP_DEVINFO_DATA; + typedef struct _SP_DEVICE_INTERFACE_DATA { + DWORD cbSize; + GUID InterfaceClassGuid; + DWORD Flags; + ULONG_PTR Reserved; + } SP_DEVICE_INTERFACE_DATA, *PSP_DEVICE_INTERFACE_DATA; + typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA { + DWORD cbSize; + CHAR DevicePath[ANYSIZE_ARRAY]; + } SP_DEVICE_INTERFACE_DETAIL_DATA_A, *PSP_DEVICE_INTERFACE_DETAIL_DATA_A; + typedef PVOID HDEVINFO; + + HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID*,PCSTR,HWND,DWORD); + + #define DIGCF_PRESENT 0x00000002 + #define DIGCF_DEVICEINTERFACE 0x00000010 + #define SPDRP_CLASS 7 + #define SPDRP_DRIVER 9 + #define FILE_DEVICE_KEYBOARD 0x0000000b + #define METHOD_OUT_DIRECT 2 + enum + { FILE_ANY_ACCESS = 0x00000000UL, + FILE_SPECIAL_ACCESS = FILE_ANY_ACCESS, + FILE_READ_ACCESS = 0x00000001UL, + FILE_WRITE_ACCESS = 0x00000002UL + }; + #define CTL_CODE(t,f,m,a) (((t)<<16)|((a)<<14)|((f)<<2)|(m)) + +#else + #include + #include +#endif + #ifdef HIDAPI_USE_DDK + #include + #endif + + /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ + #define HID_OUT_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include +#include + + +#include "hidapi.h" + +#undef MIN +#define MIN(x,y) ((x) < (y)? (x): (y)) + +#ifdef _MSC_VER + /* Thanks Microsoft, but I know how to use strncpy(). */ + #pragma warning(disable:4996) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HIDAPI_USE_DDK + /* Since we're not building with the DDK, and the HID header + files aren't part of the SDK, we have to define all this + stuff here. In lookup_functions(), the function pointers + defined below are set. */ + typedef struct _HIDD_ATTRIBUTES{ + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; + } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; + + typedef USHORT USAGE; + typedef struct _HIDP_CAPS { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT fields_not_used_by_hidapi[10]; + } HIDP_CAPS, *PHIDP_CAPS; + typedef void* PHIDP_PREPARSED_DATA; + #define HIDP_STATUS_SUCCESS 0x110000 + + typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); + typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); + typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); + typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); + typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); + + static HidD_GetAttributes_ HidD_GetAttributes; + static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; + static HidD_GetManufacturerString_ HidD_GetManufacturerString; + static HidD_GetProductString_ HidD_GetProductString; + static HidD_SetFeature_ HidD_SetFeature; + static HidD_GetFeature_ HidD_GetFeature; + static HidD_GetIndexedString_ HidD_GetIndexedString; + static HidD_GetPreparsedData_ HidD_GetPreparsedData; + static HidD_FreePreparsedData_ HidD_FreePreparsedData; + static HidP_GetCaps_ HidP_GetCaps; + static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; + + static HMODULE lib_handle = NULL; + static BOOLEAN initialized = FALSE; +#endif /* HIDAPI_USE_DDK */ + +struct hid_device_ { + HANDLE device_handle; + BOOL blocking; + USHORT output_report_length; + size_t input_report_length; + void *last_error_str; + DWORD last_error_num; + BOOL read_pending; + char *read_buf; + OVERLAPPED ol; +}; + +static hid_device *new_hid_device() +{ + hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); + dev->device_handle = INVALID_HANDLE_VALUE; + dev->blocking = TRUE; + dev->output_report_length = 0; + dev->input_report_length = 0; + dev->last_error_str = NULL; + dev->last_error_num = 0; + dev->read_pending = FALSE; + dev->read_buf = NULL; + memset(&dev->ol, 0, sizeof(dev->ol)); + dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + CloseHandle(dev->ol.hEvent); + CloseHandle(dev->device_handle); + LocalFree(dev->last_error_str); + free(dev->read_buf); + free(dev); +} + +static void register_error(hid_device *device, const char *op) +{ + WCHAR *ptr, *msg; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPVOID)&msg, 0/*sz*/, + NULL); + + /* Get rid of the CR and LF that FormatMessage() sticks at the + end of the message. Thanks Microsoft! */ + ptr = msg; + while (*ptr) { + if (*ptr == '\r') { + *ptr = 0x0000; + break; + } + ptr++; + } + + /* Store the message off in the Device entry so that + the hid_error() function can pick it up. */ + LocalFree(device->last_error_str); + device->last_error_str = msg; +} + +#ifndef HIDAPI_USE_DDK +static int lookup_functions() +{ + lib_handle = LoadLibraryA("hid.dll"); + if (lib_handle) { +#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; + RESOLVE(HidD_GetAttributes); + RESOLVE(HidD_GetSerialNumberString); + RESOLVE(HidD_GetManufacturerString); + RESOLVE(HidD_GetProductString); + RESOLVE(HidD_SetFeature); + RESOLVE(HidD_GetFeature); + RESOLVE(HidD_GetIndexedString); + RESOLVE(HidD_GetPreparsedData); + RESOLVE(HidD_FreePreparsedData); + RESOLVE(HidP_GetCaps); + RESOLVE(HidD_SetNumInputBuffers); +#undef RESOLVE + } + else + return -1; + + return 0; +} +#endif + +static HANDLE open_device(const char *path, BOOL enumerate) +{ + HANDLE handle; + DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); + DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; + + handle = CreateFileA(path, + desired_access, + share_mode, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ + 0); + + return handle; +} + +int HID_API_EXPORT hid_init(void) +{ +#ifndef HIDAPI_USE_DDK + if (!initialized) { + if (lookup_functions() < 0) { + hid_exit(); + return -1; + } + initialized = TRUE; + } +#endif + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ +#ifndef HIDAPI_USE_DDK + if (lib_handle) + FreeLibrary(lib_handle); + lib_handle = NULL; + initialized = FALSE; +#endif + return 0; +} + +struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + BOOL res; + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + + /* Windows objects for interacting with the driver. */ + GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; + SP_DEVINFO_DATA devinfo_data; + SP_DEVICE_INTERFACE_DATA device_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; + HDEVINFO device_info_set = INVALID_HANDLE_VALUE; + int device_index = 0; + int i; + + if (hid_init() < 0) + return NULL; + + /* Initialize the Windows objects. */ + memset(&devinfo_data, 0x0, sizeof(devinfo_data)); + devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); + device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + /* Get information for all the devices belonging to the HID class. */ + device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + /* Iterate over each device in the HID class, looking for the right one. */ + + for (;;) { + HANDLE write_handle = INVALID_HANDLE_VALUE; + DWORD required_size = 0; + HIDD_ATTRIBUTES attrib; + + res = SetupDiEnumDeviceInterfaces(device_info_set, + NULL, + &InterfaceClassGuid, + device_index, + &device_interface_data); + + if (!res) { + /* A return of FALSE from this function means that + there are no more devices. */ + break; + } + + /* Call with 0-sized detail size, and let the function + tell us how long the detail struct needs to be. The + size is put in &required_size. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + NULL, + 0, + &required_size, + NULL); + + /* Allocate a long enough structure for device_interface_detail_data. */ + device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); + device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + + /* Get the detailed data for this device. The detail data gives us + the device path for this device, which is then passed into + CreateFile() to get a handle to the device. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + device_interface_detail_data, + required_size, + NULL, + NULL); + + if (!res) { + /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); + Continue to the next device. */ + goto cont; + } + + /* Make sure this device is of Setup Class "HIDClass" and has a + driver bound to it. */ + for (i = 0; ; i++) { + char driver_name[256]; + + /* Populate devinfo_data. This function will return failure + when there are no more interfaces left. */ + res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); + if (!res) + goto cont; + + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (!res) + goto cont; + + if (strcmp(driver_name, "HIDClass") == 0) { + /* See if there's a driver bound. */ + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (res) + break; + } + } + + //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); + + /* Open a handle to the device */ + write_handle = open_device(device_interface_detail_data->DevicePath, TRUE); + + /* Check validity of write_handle. */ + if (write_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device. */ + //register_error(dev, "CreateFile"); + goto cont_close; + } + + + /* Get the Vendor ID and Product ID for this device. */ + attrib.Size = sizeof(HIDD_ATTRIBUTES); + HidD_GetAttributes(write_handle, &attrib); + //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); + + /* Check the VID/PID to see if we should add this + device to the enumeration list. */ + if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && + (product_id == 0x0 || attrib.ProductID == product_id)) { + + #define WSTR_LEN 512 + const char *str; + struct hid_device_info *tmp; + PHIDP_PREPARSED_DATA pp_data = NULL; + HIDP_CAPS caps; + BOOLEAN res; + NTSTATUS nt_res; + wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ + size_t len; + + /* VID/PID match. Create the record. */ + tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + res = HidD_GetPreparsedData(write_handle, &pp_data); + if (res) { + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res == HIDP_STATUS_SUCCESS) { + cur_dev->usage_page = caps.UsagePage; + cur_dev->usage = caps.Usage; + } + + HidD_FreePreparsedData(pp_data); + } + + /* Fill out the record */ + cur_dev->next = NULL; + str = device_interface_detail_data->DevicePath; + if (str) { + len = strlen(str); + cur_dev->path = (char*) calloc(len+1, sizeof(char)); + strncpy(cur_dev->path, str, len+1); + cur_dev->path[len] = '\0'; + } + else + cur_dev->path = NULL; + + /* Serial Number */ + res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->serial_number = _wcsdup(wstr); + } + + /* Manufacturer String */ + res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->manufacturer_string = _wcsdup(wstr); + } + + /* Product String */ + res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->product_string = _wcsdup(wstr); + } + + /* VID/PID */ + cur_dev->vendor_id = attrib.VendorID; + cur_dev->product_id = attrib.ProductID; + + /* Release Number */ + cur_dev->release_number = attrib.VersionNumber; + + /* Interface Number. It can sometimes be parsed out of the path + on Windows if a device has multiple interfaces. See + http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or + search for "Hardware IDs for HID Devices" at MSDN. If it's not + in the path, it's set to -1. */ + cur_dev->interface_number = -1; + if (cur_dev->path) { + char *interface_component = strstr(cur_dev->path, "&mi_"); + if (interface_component) { + char *hex_str = interface_component + 4; + char *endptr = NULL; + cur_dev->interface_number = strtol(hex_str, &endptr, 16); + if (endptr == hex_str) { + /* The parsing failed. Set interface_number to -1. */ + cur_dev->interface_number = -1; + } + } + } + } + +cont_close: + CloseHandle(write_handle); +cont: + /* We no longer need the detail data. It can be freed */ + free(device_interface_detail_data); + + device_index++; + + } + + /* Close the device information handle. */ + SetupDiDestroyDeviceInfoList(device_info_set); + + return root; + +} + +void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) +{ + /* TODO: Merge this with the Linux version. This function is platform-independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + + +HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) +{ + hid_device *dev; + HIDP_CAPS caps; + PHIDP_PREPARSED_DATA pp_data = NULL; + BOOLEAN res; + NTSTATUS nt_res; + + if (hid_init() < 0) { + return NULL; + } + + dev = new_hid_device(); + + /* Open a handle to the device */ + dev->device_handle = open_device(path, FALSE); + + /* Check validity of write_handle. */ + if (dev->device_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device. */ + register_error(dev, "CreateFile"); + goto err; + } + + /* Set the Input Report buffer size to 64 reports. */ + res = HidD_SetNumInputBuffers(dev->device_handle, 64); + if (!res) { + register_error(dev, "HidD_SetNumInputBuffers"); + goto err; + } + + /* Get the Input Report length for the device. */ + res = HidD_GetPreparsedData(dev->device_handle, &pp_data); + if (!res) { + register_error(dev, "HidD_GetPreparsedData"); + goto err; + } + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res != HIDP_STATUS_SUCCESS) { + register_error(dev, "HidP_GetCaps"); + goto err_pp_data; + } + dev->output_report_length = caps.OutputReportByteLength; + dev->input_report_length = caps.InputReportByteLength; + HidD_FreePreparsedData(pp_data); + + dev->read_buf = (char*) malloc(dev->input_report_length); + + return dev; + +err_pp_data: + HidD_FreePreparsedData(pp_data); +err: + free_hid_device(dev); + return NULL; +} + +int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + DWORD bytes_written; + BOOL res; + + OVERLAPPED ol; + unsigned char *buf; + memset(&ol, 0, sizeof(ol)); + + /* Make sure the right number of bytes are passed to WriteFile. Windows + expects the number of bytes which are in the _longest_ report (plus + one for the report number) bytes even if the data is a report + which is shorter than that. Windows gives us this value in + caps.OutputReportByteLength. If a user passes in fewer bytes than this, + create a temporary buffer which is the proper size. */ + if (length >= dev->output_report_length) { + /* The user passed the right number of bytes. Use the buffer as-is. */ + buf = (unsigned char *) data; + } else { + /* Create a temporary buffer and copy the user's data + into it, padding the rest with zeros. */ + buf = (unsigned char *) malloc(dev->output_report_length); + memcpy(buf, data, length); + memset(buf + length, 0, dev->output_report_length - length); + length = dev->output_report_length; + } + + res = WriteFile(dev->device_handle, buf, (DWORD)length, NULL, &ol); + int err = GetLastError(); + + if (!res) { + if (err != ERROR_IO_PENDING) { + /* WriteFile() failed. Return error. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + } + + /* Wait here until the write is done. This makes + hid_write() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); + if (!res) { + /* The Write operation failed. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + +end_of_function: + if (buf != data) + free(buf); + + return bytes_written; +} + + +int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + DWORD bytes_read = 0; + size_t copy_len = 0; + BOOL res; + + /* Copy the handle for convenience. */ + HANDLE ev = dev->ol.hEvent; + + if (!dev->read_pending) { + /* Start an Overlapped I/O read. */ + dev->read_pending = TRUE; + memset(dev->read_buf, 0, dev->input_report_length); + ResetEvent(ev); + res = ReadFile(dev->device_handle, dev->read_buf, (DWORD)dev->input_report_length, &bytes_read, &dev->ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* ReadFile() has failed. + Clean up and return error. */ + CancelIo(dev->device_handle); + dev->read_pending = FALSE; + goto end_of_function; + } + } + } + + if (milliseconds >= 0) { + /* See if there is any data yet. */ + res = WaitForSingleObject(ev, milliseconds); + if (res != WAIT_OBJECT_0) { + /* There was no data this time. Return zero bytes available, + but leave the Overlapped I/O running. */ + return 0; + } + } + + /* Either WaitForSingleObject() told us that ReadFile has completed, or + we are in non-blocking mode. Get the number of bytes read. The actual + data has been copied to the data[] array which was passed to ReadFile(). */ + res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); + + /* Set pending back to false, even if GetOverlappedResult() returned error. */ + dev->read_pending = FALSE; + + if (res && bytes_read > 0) { + if (dev->read_buf[0] == 0x0) { + /* If report numbers aren't being used, but Windows sticks a report + number (0x0) on the beginning of the report anyway. To make this + work like the other platforms, and to make it work more like the + HID spec, we'll skip over this byte. */ + bytes_read--; + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf+1, copy_len); + } + else { + /* Copy the whole buffer, report number and all. */ + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf, copy_len); + } + } + +end_of_function: + if (!res) { + register_error(dev, "GetOverlappedResult"); + return -1; + } + + return (int)copy_len; +} + +int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) +{ + dev->blocking = !nonblock; + return 0; /* Success */ +} + +int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, (ULONG)length); + if (!res) { + register_error(dev, "HidD_SetFeature"); + return -1; + } + + return (int)length; +} + + +int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + BOOL res; +#if 0 + res = HidD_GetFeature(dev->device_handle, data, length); + if (!res) { + register_error(dev, "HidD_GetFeature"); + return -1; + } + return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ +#else + DWORD bytes_returned; + + OVERLAPPED ol; + memset(&ol, 0, sizeof(ol)); + + res = DeviceIoControl(dev->device_handle, + IOCTL_HID_GET_FEATURE, + data, (DWORD)length, + data, (DWORD)length, + &bytes_returned, &ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* DeviceIoControl() failed. Return error. */ + register_error(dev, "Send Feature Report DeviceIoControl"); + return -1; + } + } + + /* Wait here until the write is done. This makes + hid_get_feature_report() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); + if (!res) { + /* The operation failed. */ + register_error(dev, "Send Feature Report GetOverLappedResult"); + return -1; + } + + /* bytes_returned does not include the first byte which contains the + report ID. The data buffer actually contains one more byte than + bytes_returned. */ + bytes_returned++; + + return bytes_returned; +#endif +} + +void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) +{ + if (!dev) + return; + CancelIo(dev->device_handle); + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetManufacturerString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetManufacturerString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetProductString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetProductString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetSerialNumberString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetSerialNumberString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetIndexedString(dev->device_handle, string_index, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); + if (!res) { + register_error(dev, "HidD_GetIndexedString"); + return -1; + } + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return (wchar_t*)dev->last_error_str; +} + + +/*#define PICPGM*/ +/*#define S11*/ +#define P32 +#ifdef S11 + unsigned short VendorID = 0xa0a0; + unsigned short ProductID = 0x0001; +#endif + +#ifdef P32 + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x3f; +#endif + + +#ifdef PICPGM + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x0033; +#endif + + +#if 0 +int __cdecl main(int argc, char* argv[]) +{ + int res; + unsigned char buf[65]; + + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + + /* Set up the command buffer. */ + memset(buf,0x00,sizeof(buf)); + buf[0] = 0; + buf[1] = 0x81; + + + /* Open the device. */ + int handle = open(VendorID, ProductID, L"12345"); + if (handle < 0) + printf("unable to open device\n"); + + + /* Toggle LED (cmd 0x80) */ + buf[1] = 0x80; + res = write(handle, buf, 65); + if (res < 0) + printf("Unable to write()\n"); + + /* Request state (cmd 0x81) */ + buf[1] = 0x81; + write(handle, buf, 65); + if (res < 0) + printf("Unable to write() (2)\n"); + + /* Read requested state */ + read(handle, buf, 65); + if (res < 0) + printf("Unable to read()\n"); + + /* Print out the returned buffer. */ + for (int i = 0; i < 4; i++) + printf("buf[%d]: %d\n", i, buf[i]); + + return 0; +} +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#elif defined( __MACOSX__ ) + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 2010-07-03 + + Copyright 2010, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* See Apple Technical Note TN2187 for details on IOHidManager. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hidapi.h" + +/* Barrier implementation because Mac OSX doesn't have pthread_barrier. + It also doesn't have clock_gettime(). So much for POSIX and SUSv2. + This implementation came from Brent Priddy and was posted on + StackOverflow. It is used with his permission. */ +typedef int pthread_barrierattr_t; +typedef struct pthread_barrier { + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int trip_count; +} pthread_barrier_t; + +static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) { + errno = EINVAL; + return -1; + } + + if(pthread_mutex_init(&barrier->mutex, 0) < 0) { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->trip_count = count; + barrier->count = 0; + + return 0; +} + +static int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +static int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->trip_count) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +static int return_data(hid_device *dev, unsigned char *data, size_t length); + +/* Linked List of input reports received from the device. */ +struct input_report { + uint8_t *data; + size_t len; + struct input_report *next; +}; + +struct hid_device_ { + IOHIDDeviceRef device_handle; + int blocking; + int uses_numbered_reports; + int disconnected; + CFStringRef run_loop_mode; + CFRunLoopRef run_loop; + CFRunLoopSourceRef source; + uint8_t *input_report_buf; + CFIndex max_input_report_len; + struct input_report *input_reports; + + pthread_t thread; + pthread_mutex_t mutex; /* Protects input_reports */ + pthread_cond_t condition; + pthread_barrier_t barrier; /* Ensures correct startup sequence */ + pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ + int shutdown_thread; +}; + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = NULL; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + dev->disconnected = 0; + dev->run_loop_mode = NULL; + dev->run_loop = NULL; + dev->source = NULL; + dev->input_report_buf = NULL; + dev->input_reports = NULL; + dev->shutdown_thread = 0; + + /* Thread objects */ + pthread_mutex_init(&dev->mutex, NULL); + pthread_cond_init(&dev->condition, NULL); + pthread_barrier_init(&dev->barrier, NULL, 2); + pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + if (!dev) + return; + + /* Delete any input reports still left over. */ + struct input_report *rpt = dev->input_reports; + while (rpt) { + struct input_report *next = rpt->next; + free(rpt->data); + free(rpt); + rpt = next; + } + + /* Free the string and the report buffer. The check for NULL + is necessary here as CFRelease() doesn't handle NULL like + free() and others do. */ + if (dev->run_loop_mode) + CFRelease(dev->run_loop_mode); + if (dev->source) + CFRelease(dev->source); + free(dev->input_report_buf); + + /* Clean up the thread objects */ + pthread_barrier_destroy(&dev->shutdown_barrier); + pthread_barrier_destroy(&dev->barrier); + pthread_cond_destroy(&dev->condition); + pthread_mutex_destroy(&dev->mutex); + + /* Free the structure itself. */ + free(dev); +} + +static IOHIDManagerRef hid_mgr = 0x0; + + +#if 0 +static void register_error(hid_device *device, const char *op) +{ + +} +#endif + + +static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) +{ + CFTypeRef ref; + int32_t value; + + ref = IOHIDDeviceGetProperty(device, key); + if (ref) { + if (CFGetTypeID(ref) == CFNumberGetTypeID()) { + CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); + return value; + } + } + return 0; +} + +static unsigned short get_vendor_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); +} + +static unsigned short get_product_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDProductIDKey)); +} + +static int32_t get_max_report_length(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); +} + +static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) +{ + CFStringRef str; + + if (!len) + return 0; + + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; + + if (str) { + CFIndex str_len = CFStringGetLength(str); + CFRange range; + CFIndex used_buf_len; + CFIndex chars_copied; + + len --; + + range.location = 0; + range.length = ((size_t)str_len > len)? len: (size_t)str_len; + chars_copied = CFStringGetBytes(str, + range, + kCFStringEncodingUTF32LE, + (char)'?', + FALSE, + (UInt8*)buf, + len * sizeof(wchar_t), + &used_buf_len); + + if (chars_copied == len) + buf[len] = 0; /* len is decremented above */ + else + buf[chars_copied] = 0; + + return 0; + } + else + return -1; + +} + +static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); +} + +static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); +} + +static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); +} + + +/* Implementation of wcsdup() for Mac. */ +static wchar_t *dup_wcs(const wchar_t *s) +{ + size_t len = wcslen(s); + wchar_t *ret = malloc((len+1)*sizeof(wchar_t)); + wcscpy(ret, s); + + return ret; +} + +/* hidapi_IOHIDDeviceGetService() + * + * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: + * - on OS X 10.6 and above, calling IOHIDDeviceGetService() + * - on OS X 10.5, extract it from the IOHIDDevice struct + */ +static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) +{ + static void *iokit_framework = NULL; + static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; + + /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. + * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL + * and the fallback method will be used. + */ + if (iokit_framework == NULL) { + iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); + + if (iokit_framework != NULL) + dynamic_IOHIDDeviceGetService = dlsym(iokit_framework, "IOHIDDeviceGetService"); + } + + if (dynamic_IOHIDDeviceGetService != NULL) { + /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ + return dynamic_IOHIDDeviceGetService(device); + } + else + { + /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. + * + * Be naughty and pull the service out of the IOHIDDevice. + * IOHIDDevice is an opaque struct not exposed to applications, but its + * layout is stable through all available versions of OS X. + * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. + */ + struct IOHIDDevice_internal { + /* The first field of the IOHIDDevice struct is a + * CFRuntimeBase (which is a private CF struct). + * + * a, b, and c are the 3 fields that make up a CFRuntimeBase. + * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h + * + * The second field of the IOHIDDevice is the io_service_t we're looking for. + */ + uintptr_t a; + uint8_t b[4]; +#if __LP64__ + uint32_t c; +#endif + io_service_t service; + }; + struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; + + return tmp->service; + } +} + +/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ +static int init_hid_manager(void) +{ + /* Initialize all the HID Manager Objects */ + hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hid_mgr) { + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + return 0; + } + + return -1; +} + +/* Initialize the IOHIDManager if necessary. This is the public function, and + it is safe to call this function repeatedly. Return 0 for success and -1 + for failure. */ +int HID_API_EXPORT hid_init(void) +{ + if (!hid_mgr) { + return init_hid_manager(); + } + + /* Already initialized. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (hid_mgr) { + /* Close the HID manager. */ + IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); + CFRelease(hid_mgr); + hid_mgr = NULL; + } + + return 0; +} + +static void process_pending_events(void) { + SInt32 res; + do { + res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); + } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); +} + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + CFIndex num_devices; + int i; + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); + + /* Get a list of the Devices */ + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); + + /* Convert the list into a C array so we can iterate easily. */ + num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + /* Iterate over each device, making an entry for it. */ + for (i = 0; i < num_devices; i++) { + unsigned short dev_vid; + unsigned short dev_pid; + #define BUF_LEN 256 + wchar_t buf[BUF_LEN]; + + IOHIDDeviceRef dev = device_array[i]; + + if (!dev) { + continue; + } + dev_vid = get_vendor_id(dev); + dev_pid = get_product_id(dev); + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + io_object_t iokit_dev; + kern_return_t res; + io_string_t path; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); + cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); + + /* Fill out the record */ + cur_dev->next = NULL; + + /* Fill in the path (IOService plane) */ + iokit_dev = hidapi_IOHIDDeviceGetService(dev); + res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); + if (res == KERN_SUCCESS) + cur_dev->path = strdup(path); + else + cur_dev->path = strdup(""); + + /* Serial Number */ + get_serial_number(dev, buf, BUF_LEN); + cur_dev->serial_number = dup_wcs(buf); + + /* Manufacturer and Product strings */ + get_manufacturer_string(dev, buf, BUF_LEN); + cur_dev->manufacturer_string = dup_wcs(buf); + get_product_string(dev, buf, BUF_LEN); + cur_dev->product_string = dup_wcs(buf); + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Release Number */ + cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); + + /* Interface Number (Unsupported on Mac)*/ + cur_dev->interface_number = -1; + } + } + + free(device_array); + CFRelease(device_set); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device * handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +static void hid_device_removal_callback(void *context, IOReturn result, + void *sender) +{ + /* Stop the Run Loop for this device. */ + hid_device *d = context; + + d->disconnected = 1; + CFRunLoopStop(d->run_loop); +} + +/* The Run Loop calls this function for each input report received. + This function puts the data into a linked list to be picked up by + hid_read(). */ +static void hid_report_callback(void *context, IOReturn result, void *sender, + IOHIDReportType report_type, uint32_t report_id, + uint8_t *report, CFIndex report_length) +{ + struct input_report *rpt; + hid_device *dev = context; + + /* Make a new Input Report object */ + rpt = calloc(1, sizeof(struct input_report)); + rpt->data = calloc(1, report_length); + memcpy(rpt->data, report, report_length); + rpt->len = report_length; + rpt->next = NULL; + + /* Lock this section */ + pthread_mutex_lock(&dev->mutex); + + /* Attach the new report object to the end of the list. */ + if (dev->input_reports == NULL) { + /* The list is empty. Put it at the root. */ + dev->input_reports = rpt; + } + else { + /* Find the end of the list and attach. */ + struct input_report *cur = dev->input_reports; + int num_queued = 0; + while (cur->next != NULL) { + cur = cur->next; + num_queued++; + } + cur->next = rpt; + + /* Pop one off if we've reached 30 in the queue. This + way we don't grow forever if the user never reads + anything from the device. */ + if (num_queued > 30) { + return_data(dev, NULL, 0); + } + } + + /* Signal a waiting thread that there is data. */ + pthread_cond_signal(&dev->condition); + + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + +} + +/* This gets called when the read_thread's run loop gets signaled by + hid_close(), and serves to stop the read_thread's run loop. */ +static void perform_signal_callback(void *context) +{ + hid_device *dev = context; + CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ +} + +static void *read_thread(void *param) +{ + hid_device *dev = param; + SInt32 code; + + /* Move the device's run loop to this thread. */ + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); + + /* Create the RunLoopSource which is used to signal the + event loop to stop when hid_close() is called. */ + CFRunLoopSourceContext ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.version = 0; + ctx.info = dev; + ctx.perform = &perform_signal_callback; + dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); + + /* Store off the Run Loop so it can be stopped from hid_close() + and on device disconnection. */ + dev->run_loop = CFRunLoopGetCurrent(); + + /* Notify the main thread that the read thread is up and running. */ + pthread_barrier_wait(&dev->barrier); + + /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input + reports into the hid_report_callback(). */ + while (!dev->shutdown_thread && !dev->disconnected) { + code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); + /* Return if the device has been disconnected */ + if (code == kCFRunLoopRunFinished) { + dev->disconnected = 1; + break; + } + + + /* Break if The Run Loop returns Finished or Stopped. */ + if (code != kCFRunLoopRunTimedOut && + code != kCFRunLoopRunHandledSource) { + /* There was some kind of error. Setting + shutdown seems to make sense, but + there may be something else more appropriate */ + dev->shutdown_thread = 1; + break; + } + } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition actually will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); + + /* Wait here until hid_close() is called and makes it past + the call to CFRunLoopWakeUp(). This thread still needs to + be valid when that function is called on the other thread. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + return NULL; +} + +/* hid_open_path() + * + * path must be a valid path to an IOHIDDevice in the IOService plane + * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" + */ +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + io_registry_entry_t entry = MACH_PORT_NULL; + + dev = new_hid_device(); + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* Get the IORegistry entry for the given path */ + entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); + if (entry == MACH_PORT_NULL) { + /* Path wasn't valid (maybe device was removed?) */ + goto return_error; + } + + /* Create an IOHIDDevice for the entry */ + dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); + if (dev->device_handle == NULL) { + /* Error creating the HID device */ + goto return_error; + } + + /* Open the IOHIDDevice */ + IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + if (ret == kIOReturnSuccess) { + char str[32]; + + /* Create the buffers for receiving data */ + dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); + dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); + + /* Create the Run Loop Mode for this device. + printing the reference seems to work. */ + sprintf(str, "HIDAPI_%p", dev->device_handle); + dev->run_loop_mode = + CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); + + /* Attach the device to a Run Loop */ + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + &hid_report_callback, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); + + /* Start the read thread */ + pthread_create(&dev->thread, NULL, read_thread, dev); + + /* Wait here for the read thread to be initialized. */ + pthread_barrier_wait(&dev->barrier); + + IOObjectRelease(entry); + return dev; + } + else { + goto return_error; + } + +return_error: + if (dev->device_handle != NULL) + CFRelease(dev->device_handle); + + if (entry != MACH_PORT_NULL) + IOObjectRelease(entry); + + free_hid_device(dev); + return NULL; +} + +static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) +{ + const unsigned char *data_to_send; + size_t length_to_send; + IOReturn res; + + /* Return if the device has been disconnected. */ + if (dev->disconnected) + return -1; + + if (data[0] == 0x0) { + /* Not using numbered Reports. + Don't send the report number. */ + data_to_send = data+1; + length_to_send = length-1; + } + else { + /* Using numbered Reports. + Send the Report Number */ + data_to_send = data; + length_to_send = length; + } + + if (!dev->disconnected) { + res = IOHIDDeviceSetReport(dev->device_handle, + type, + data[0], /* Report ID*/ + data_to_send, length_to_send); + + if (res == kIOReturnSuccess) { + return length; + } + else + return -1; + } + + return -1; +} + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeOutput, data, length); +} + +/* Helper function, so that this isn't duplicated in hid_read(). */ +static int return_data(hid_device *dev, unsigned char *data, size_t length) +{ + /* Copy the data out of the linked list item (rpt) into the + return buffer (data), and delete the liked list item. */ + struct input_report *rpt = dev->input_reports; + size_t len = (length < rpt->len)? length: rpt->len; + memcpy(data, rpt->data, len); + dev->input_reports = rpt->next; + free(rpt->data); + free(rpt); + return len; +} + +static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + while (!dev->input_reports) { + int res = pthread_cond_wait(cond, mutex); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; +} + +static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +{ + while (!dev->input_reports) { + int res = pthread_cond_timedwait(cond, mutex, abstime); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; + +} + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read = -1; + + /* Lock the access to the report list. */ + pthread_mutex_lock(&dev->mutex); + + /* There's an input report queued up. Return it. */ + if (dev->input_reports) { + /* Return the first one */ + bytes_read = return_data(dev, data, length); + goto ret; + } + + /* Return if the device has been disconnected. */ + if (dev->disconnected) { + bytes_read = -1; + goto ret; + } + + if (dev->shutdown_thread) { + /* This means the device has been closed (or there + has been an error. An error code of -1 should + be returned. */ + bytes_read = -1; + goto ret; + } + + /* There is no data. Go to sleep and wait for data. */ + + if (milliseconds == -1) { + /* Blocking */ + int res; + res = cond_wait(dev, &dev->condition, &dev->mutex); + if (res == 0) + bytes_read = return_data(dev, data, length); + else { + /* There was an error, or a device disconnection. */ + bytes_read = -1; + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + + res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); + if (res == 0) + bytes_read = return_data(dev, data, length); + else if (res == ETIMEDOUT) + bytes_read = 0; + else + bytes_read = -1; + } + else { + /* Purely non-blocking */ + bytes_read = 0; + } + +ret: + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* All Nonblocking operation is handled by the library. */ + dev->blocking = !nonblock; + + return 0; +} + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeFeature, data, length); +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + CFIndex len = length; + IOReturn res; + + /* Return if the device has been unplugged. */ + if (dev->disconnected) + return -1; + + res = IOHIDDeviceGetReport(dev->device_handle, + kIOHIDReportTypeFeature, + data[0], /* Report ID */ + data, &len); + if (res == kIOReturnSuccess) + return len; + else + return -1; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + + /* Disconnect the report callback before close. */ + if (!dev->disconnected) { + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + NULL, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev); + IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); + } + + /* Cause read_thread() to stop. */ + dev->shutdown_thread = 1; + + /* Wake up the run thread's event loop so that the thread can exit. */ + CFRunLoopSourceSignal(dev->source); + CFRunLoopWakeUp(dev->run_loop); + + /* Notify the read thread that it can shut down now. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + /* Wait for read_thread() to end. */ + pthread_join(dev->thread, NULL); + + /* Close the OS handle to the device, but only if it's not + been unplugged. If it's been unplugged, then calling + IOHIDDeviceClose() will crash. */ + if (!dev->disconnected) { + IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + } + + /* Clear out the queue of received reports. */ + pthread_mutex_lock(&dev->mutex); + while (dev->input_reports) { + return_data(dev, NULL, 0); + } + pthread_mutex_unlock(&dev->mutex); + CFRelease(dev->device_handle); + + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_manufacturer_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_product_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_serial_number(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + /* TODO: */ + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + /* TODO: */ + + return NULL; +} + + + + + + + +#if 0 +static int32_t get_location_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); +} + +static int32_t get_usage(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); + return res; +} + +static int32_t get_usage_page(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); + return res; +} + +static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); +} + + +int main(void) +{ + IOHIDManagerRef mgr; + int i; + + mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + IOHIDManagerSetDeviceMatching(mgr, NULL); + IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); + + CFSetRef device_set = IOHIDManagerCopyDevices(mgr); + + CFIndex num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + for (i = 0; i < num_devices; i++) { + IOHIDDeviceRef dev = device_array[i]; + printf("Device: %p\n", dev); + printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); + + wchar_t serial[256], buf[256]; + char cbuf[256]; + get_serial_number(dev, serial, 256); + + + printf(" Serial: %ls\n", serial); + printf(" Loc: %ld\n", get_location_id(dev)); + get_transport(dev, buf, 256); + printf(" Trans: %ls\n", buf); + make_path(dev, cbuf, 256); + printf(" Path: %s\n", cbuf); + + } + + return 0; +} +#endif + + +#else //Linux + +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + Linux Version - 6/2/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* C */ +#include +#include +#include +#include +#include + +/* Unix */ +#include +#include +#include +#include +#include +#include +#include + +/* Linux */ +#include +#include +#include +#include + +#include "hidapi.h" + +/* Definitions from linux/hidraw.h. Since these are new, some distros + may not have header files which contain them. */ +#ifndef HIDIOCSFEATURE +#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) +#endif +#ifndef HIDIOCGFEATURE +#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) +#endif + + +/* USB HID device property names */ +const char *device_string_names[] = { + "manufacturer", + "product", + "serial", +}; + +/* Symbolic names for the properties above */ +enum device_string_id { + DEVICE_STRING_MANUFACTURER, + DEVICE_STRING_PRODUCT, + DEVICE_STRING_SERIAL, + + DEVICE_STRING_COUNT, +}; + +struct hid_device_ { + int device_handle; + int blocking; + int uses_numbered_reports; +}; + + +static __u32 kernel_version = 0; + +static __u32 detect_kernel_version(void) +{ + struct utsname name; + int major, minor, release; + int ret; + + uname(&name); + ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release); + if (ret == 3) { + return KERNEL_VERSION(major, minor, release); + } + + ret = sscanf(name.release, "%d.%d", &major, &minor); + if (ret == 2) { + return KERNEL_VERSION(major, minor, 0); + } + + printf("Couldn't determine kernel version from version string \"%s\"\n", name.release); + return 0; +} + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = -1; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + + return dev; +} + + +/* The caller must free the returned string with free(). */ +static wchar_t *utf8_to_wchar_t(const char *utf8) +{ + wchar_t *ret = NULL; + + if (utf8) { + size_t wlen = mbstowcs(NULL, utf8, 0); + if ((size_t) -1 == wlen) { + return wcsdup(L""); + } + ret = calloc(wlen+1, sizeof(wchar_t)); + mbstowcs(ret, utf8, wlen+1); + ret[wlen] = 0x0000; + } + + return ret; +} + +/* Get an attribute value from a udev_device and return it as a whar_t + string. The returned string must be freed with free() when done.*/ +static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name) +{ + return utf8_to_wchar_t(udev_device_get_sysattr_value(dev, udev_name)); +} + +/* uses_numbered_reports() returns 1 if report_descriptor describes a device + which contains numbered reports. */ +static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { + unsigned int i = 0; + int size_code; + int data_len, key_size; + + while (i < size) { + int key = report_descriptor[i]; + + /* Check for the Report ID key */ + if (key == 0x85/*Report ID*/) { + /* This device has a Report ID, which means it uses + numbered reports. */ + return 1; + } + + //printf("key: %02hhx\n", key); + + if ((key & 0xf0) == 0xf0) { + /* This is a Long Item. The next byte contains the + length of the data section (value) for this key. + See the HID specification, version 1.11, section + 6.2.2.3, titled "Long Items." */ + if (i+1 < size) + data_len = report_descriptor[i+1]; + else + data_len = 0; /* malformed report */ + key_size = 3; + } + else { + /* This is a Short Item. The bottom two bits of the + key contain the size code for the data section + (value) for this key. Refer to the HID + specification, version 1.11, section 6.2.2.2, + titled "Short Items." */ + size_code = key & 0x3; + switch (size_code) { + case 0: + case 1: + case 2: + data_len = size_code; + break; + case 3: + data_len = 4; + break; + default: + /* Can't ever happen since size_code is & 0x3 */ + data_len = 0; + break; + }; + key_size = 1; + } + + /* Skip over this key and it's associated data */ + i += data_len + key_size; + } + + /* Didn't find a Report ID key. Device doesn't use numbered reports. */ + return 0; +} + +/* + * The caller is responsible for free()ing the (newly-allocated) character + * strings pointed to by serial_number_utf8 and product_name_utf8 after use. + */ +static int +parse_uevent_info(const char *uevent, int *bus_type, + unsigned short *vendor_id, unsigned short *product_id, + char **serial_number_utf8, char **product_name_utf8) +{ + char *tmp = strdup(uevent); + char *saveptr = NULL; + char *line; + char *key; + char *value; + + int found_id = 0; + int found_serial = 0; + int found_name = 0; + + line = strtok_r(tmp, "\n", &saveptr); + while (line != NULL) { + /* line: "KEY=value" */ + key = line; + value = strchr(line, '='); + if (!value) { + goto next_line; + } + *value = '\0'; + value++; + + if (strcmp(key, "HID_ID") == 0) { + /** + * type vendor product + * HID_ID=0003:000005AC:00008242 + **/ + int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id); + if (ret == 3) { + found_id = 1; + } + } else if (strcmp(key, "HID_NAME") == 0) { + /* The caller has to free the product name */ + *product_name_utf8 = strdup(value); + found_name = 1; + } else if (strcmp(key, "HID_UNIQ") == 0) { + /* The caller has to free the serial number */ + *serial_number_utf8 = strdup(value); + found_serial = 1; + } + +next_line: + line = strtok_r(NULL, "\n", &saveptr); + } + + free(tmp); + return (found_id && found_name && found_serial); +} + + +static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t *string, size_t maxlen) +{ + struct udev *udev; + struct udev_device *udev_dev, *parent, *hid_dev; + struct stat s; + int ret = -1; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + + /* Create the udev object */ + udev = udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return -1; + } + + /* Get the dev_t (major/minor numbers) from the file handle. */ + ret = fstat(dev->device_handle, &s); + if (-1 == ret) + return ret; + /* Open a udev device from the dev_t. 'c' means character device. */ + udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev); + if (udev_dev) { + hid_dev = udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "hid", + NULL); + if (hid_dev) { + unsigned short dev_vid; + unsigned short dev_pid; + int bus_type; + size_t retm; + + ret = parse_uevent_info( + udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (bus_type == BUS_BLUETOOTH) { + switch (key) { + case DEVICE_STRING_MANUFACTURER: + wcsncpy(string, L"", maxlen); + ret = 0; + break; + case DEVICE_STRING_PRODUCT: + retm = mbstowcs(string, product_name_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_SERIAL: + retm = mbstowcs(string, serial_number_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_COUNT: + default: + ret = -1; + break; + } + } + else { + /* This is a USB device. Find its parent USB Device node. */ + parent = udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "usb", + "usb_device"); + if (parent) { + const char *str; + const char *key_str = NULL; + + if (key >= 0 && key < DEVICE_STRING_COUNT) { + key_str = device_string_names[key]; + } else { + ret = -1; + goto end; + } + + str = udev_device_get_sysattr_value(parent, key_str); + if (str) { + /* Convert the string from UTF-8 to wchar_t */ + retm = mbstowcs(string, str, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + goto end; + } + } + } + } + } + +end: + free(serial_number_utf8); + free(product_name_utf8); + + udev_device_unref(udev_dev); + /* parent and hid_dev don't need to be (and can't be) unref'd. + I'm not sure why, but they'll throw double-free() errors. */ + udev_unref(udev); + + return ret; +} + +int HID_API_EXPORT hid_init(void) +{ + const char *locale; + + /* Set the locale if it's not set. */ + locale = setlocale(LC_CTYPE, NULL); + if (!locale) + setlocale(LC_CTYPE, ""); + + kernel_version = detect_kernel_version(); + + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + /* Nothing to do for this in the Linux/hidraw implementation. */ + return 0; +} + + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices, *dev_list_entry; + + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + struct hid_device_info *prev_dev = NULL; /* previous device */ + + hid_init(); + + /* Create the udev object */ + udev = udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return NULL; + } + + /* Create a list of the devices in the 'hidraw' subsystem. */ + enumerate = udev_enumerate_new(udev); + udev_enumerate_add_match_subsystem(enumerate, "hidraw"); + udev_enumerate_scan_devices(enumerate); + devices = udev_enumerate_get_list_entry(enumerate); + /* For each item, see if it matches the vid/pid, and if so + create a udev_device record for it */ + udev_list_entry_foreach(dev_list_entry, devices) { + const char *sysfs_path; + const char *dev_path; + const char *str; + struct udev_device *raw_dev; /* The device's hidraw udev node. */ + struct udev_device *hid_dev; /* The device's HID udev node. */ + struct udev_device *usb_dev; /* The device's USB udev node. */ + struct udev_device *intf_dev; /* The device's interface (in the USB sense). */ + unsigned short dev_vid; + unsigned short dev_pid; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + int bus_type; + int result; + + /* Get the filename of the /sys entry for the device + and create a udev_device object (dev) representing it */ + sysfs_path = udev_list_entry_get_name(dev_list_entry); + raw_dev = udev_device_new_from_syspath(udev, sysfs_path); + dev_path = udev_device_get_devnode(raw_dev); + + hid_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "hid", + NULL); + + if (!hid_dev) { + /* Unable to find parent hid device. */ + goto next; + } + + result = parse_uevent_info( + udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (!result) { + /* parse_uevent_info() failed for at least one field. */ + goto next; + } + + if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) { + /* We only know how to handle USB and BT devices. */ + goto next; + } + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + prev_dev = cur_dev; + cur_dev = tmp; + + /* Fill out the record */ + cur_dev->next = NULL; + cur_dev->path = dev_path? strdup(dev_path): NULL; + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Serial Number */ + cur_dev->serial_number = utf8_to_wchar_t(serial_number_utf8); + + /* Release Number */ + cur_dev->release_number = 0x0; + + /* Interface Number */ + cur_dev->interface_number = -1; + + switch (bus_type) { + case BUS_USB: + /* The device pointed to by raw_dev contains information about + the hidraw device. In order to get information about the + USB device, get the parent device with the + subsystem/devtype pair of "usb"/"usb_device". This will + be several levels up the tree, but the function will find + it. */ + usb_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_device"); + + if (!usb_dev) { + /* Free this device */ + free(cur_dev->serial_number); + free(cur_dev->path); + free(cur_dev); + + /* Take it off the device list. */ + if (prev_dev) { + prev_dev->next = NULL; + cur_dev = prev_dev; + } + else { + cur_dev = root = NULL; + } + + goto next; + } + + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_MANUFACTURER]); + cur_dev->product_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_PRODUCT]); + + /* Release Number */ + str = udev_device_get_sysattr_value(usb_dev, "bcdDevice"); + cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0; + + /* Get a handle to the interface's udev node. */ + intf_dev = udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_interface"); + if (intf_dev) { + str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); + cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; + } + + break; + + case BUS_BLUETOOTH: + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = wcsdup(L""); + cur_dev->product_string = utf8_to_wchar_t(product_name_utf8); + + break; + + default: + /* Unknown device type - this should never happen, as we + * check for USB and Bluetooth devices above */ + break; + } + } + + next: + free(serial_number_utf8); + free(product_name_utf8); + udev_device_unref(raw_dev); + /* hid_dev, usb_dev and intf_dev don't need to be (and can't be) + unref()d. It will cause a double-free() error. I'm not + sure why. */ + } + /* Free the enumerator and udev objects. */ + udev_enumerate_unref(enumerate); + udev_unref(udev); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + + hid_init(); + + dev = new_hid_device(); + + /* OPEN HERE */ + dev->device_handle = open(path, O_RDWR); + + /* If we have a good handle, return it. */ + if (dev->device_handle > 0) { + + /* Get the report descriptor */ + int res, desc_size = 0; + struct hidraw_report_descriptor rpt_desc; + + memset(&rpt_desc, 0x0, sizeof(rpt_desc)); + + /* Get Report Descriptor Size */ + res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); + if (res < 0) + perror("HIDIOCGRDESCSIZE"); + + + /* Get Report Descriptor */ + rpt_desc.size = desc_size; + res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); + if (res < 0) { + perror("HIDIOCGRDESC"); + } else { + /* Determine if this device uses numbered reports. */ + dev->uses_numbered_reports = + uses_numbered_reports(rpt_desc.value, + rpt_desc.size); + } + + return dev; + } + else { + /* Unable to open any devices. */ + free(dev); + return NULL; + } +} + + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + int bytes_written; + + bytes_written = write(dev->device_handle, data, length); + + return bytes_written; +} + + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read; + + if (milliseconds >= 0) { + /* Milliseconds is either 0 (non-blocking) or > 0 (contains + a valid timeout). In both cases we want to call poll() + and wait for data to arrive. Don't rely on non-blocking + operation (O_NONBLOCK) since some kernels don't seem to + properly report device disconnection through read() when + in non-blocking mode. */ + int ret; + struct pollfd fds; + + fds.fd = dev->device_handle; + fds.events = POLLIN; + fds.revents = 0; + ret = poll(&fds, 1, milliseconds); + if (ret == -1 || ret == 0) { + /* Error or timeout */ + return ret; + } + else { + /* Check for errors on the file descriptor. This will + indicate a device disconnection. */ + if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) + return -1; + } + } + + bytes_read = read(dev->device_handle, data, length); + if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) + bytes_read = 0; + + if (bytes_read >= 0 && + kernel_version != 0 && + kernel_version < KERNEL_VERSION(2,6,34) && + dev->uses_numbered_reports) { + /* Work around a kernel bug. Chop off the first byte. */ + memmove(data, data+1, bytes_read); + bytes_read--; + } + + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* Do all non-blocking in userspace using poll(), since it looks + like there's a bug in the kernel in some versions where + read() will not return -1 on disconnection of the USB device */ + + dev->blocking = !nonblock; + return 0; /* Success */ +} + + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCSFEATURE(length), data); + if (res < 0) + perror("ioctl (SFEATURE)"); + + return res; +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data); + if (res < 0) + perror("ioctl (GFEATURE)"); + + + return res; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + close(dev->device_handle); + free(dev); +} + + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_MANUFACTURER, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_PRODUCT, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_SERIAL, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + return -1; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return NULL; +} + + +#endif + diff --git a/colorchord2/hidapi.conf b/colorchord2/hidapi.conf new file mode 100644 index 0000000..f4155e3 --- /dev/null +++ b/colorchord2/hidapi.conf @@ -0,0 +1,30 @@ +#What display output driver should be used? +outdrivers = DisplayPie, OutputLinear, DisplayHIDAPI +leds = 107 +light_siding = 2.2 +satamp = 6.000 +is_loop=1 +led_floor = .1 +note_attach_amp_iir2 = .0500 +note_attach_amp_iir2 = .1500 +note_attach_freq_iir = 0.3000 +steady_bright = 0 +pie_min=.15 +pie_max=.25 +lightx=300 +lighty=1 + +ledoutamp = 1 + +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor + + +bank1_size = 40 +bank1_id = 8 +bank2_size = 27 +bank2_id = 2 +bank3_size = 40 +bank3_id = 4 +bank4_size = 0 +bank4_id = 0 +ledisrgby = 1 diff --git a/colorchord2/hidapi.h b/colorchord2/hidapi.h new file mode 100644 index 0000000..43b8e7a --- /dev/null +++ b/colorchord2/hidapi.h @@ -0,0 +1,405 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* Copy of LICENSE-orig.txt (compatible with MIT/x11 license) + + HIDAPI - Multi-Platform library for + communication with HID devices. + + Copyright 2009, Alan Ott, Signal 11 Software. + All Rights Reserved. + + This software may be used by anyone for any reason so + long as the copyright notice in the source files + remains intact. +*/ + + +/** @file + * @defgroup API hidapi API + */ + +#ifndef HIDAPI_H__ +#define HIDAPI_H__ + +#include + +#ifdef _WIN32 + #define HID_API_EXPORT __declspec(dllexport) + #define HID_API_CALL +#else + #define HID_API_EXPORT /**< API export macro */ + #define HID_API_CALL /**< API call macro */ +#endif + +#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ + +#ifdef __cplusplus +extern "C" { +#endif + struct hid_device_; + typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ + + /** hidapi info structure */ + struct hid_device_info { + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. Valid on both Linux implementations + in all cases, and valid on the Windows implementation + only if the device contains more than one interface. */ + int interface_number; + + /** Pointer to the next device */ + struct hid_device_info *next; + }; + + + /** @brief Initialize the HIDAPI library. + + This function initializes the HIDAPI library. Calling it is not + strictly necessary, as it will be called automatically by + hid_enumerate() and any of the hid_open_*() functions if it is + needed. This function should be called at the beginning of + execution however, if there is a chance of HIDAPI handles + being opened by different threads simultaneously. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_init(void); + + /** @brief Finalize the HIDAPI library. + + This function frees all of the static data associated with + HIDAPI. It should be called at the end of execution to avoid + memory leaks. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_exit(void); + + /** @brief Enumerate the HID Devices. + + This function returns a linked list of all the HID devices + attached to the system which match vendor_id and product_id. + If @p vendor_id is set to 0 then any vendor matches. + If @p product_id is set to 0 then any product matches. + If @p vendor_id and @p product_id are both set to 0, then + all HID devices will be returned. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the types of device + to open. + @param product_id The Product ID (PID) of the types of + device to open. + + @returns + This function returns a pointer to a linked list of type + struct #hid_device, containing information about the HID devices + attached to the system, or NULL in the case of failure. Free + this linked list by calling hid_free_enumeration(). + */ + struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); + + /** @brief Free an enumeration Linked List + + This function frees a linked list created by hid_enumerate(). + + @ingroup API + @param devs Pointer to a list of struct_device returned from + hid_enumerate(). + */ + void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); + + /** @brief Open a HID device using a Vendor ID (VID), Product ID + (PID) and optionally a serial number. + + If @p serial_number is NULL, the first device with the + specified VID and PID is opened. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the device to open. + @param product_id The Product ID (PID) of the device to open. + @param serial_number The Serial Number of the device to open + (Optionally NULL). + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + + /** @brief Open a HID device by its path name. + + The path name be determined by calling hid_enumerate(), or a + platform-specific path name can be used (eg: /dev/hidraw0 on + Linux). + + @ingroup API + @param path The path name of the device to open + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); + + /** @brief Write an Output report to a HID device. + + The first byte of @p data[] must contain the Report ID. For + devices which only support a single report, this must be set + to 0x0. The remaining bytes contain the report data. Since + the Report ID is mandatory, calls to hid_write() will always + contain one more byte than the report contains. For example, + if a hid report is 16 bytes long, 17 bytes must be passed to + hid_write(), the Report ID (or 0x0, for devices with a + single report), followed by the report data (16 bytes). In + this example, the length passed in would be 17. + + hid_write() will send the data on the first OUT endpoint, if + one exists. If it does not, it will send the data through + the Control Endpoint (Endpoint 0). + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Read an Input report from a HID device with timeout. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + @param milliseconds timeout in milliseconds or -1 for blocking wait. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read within + the timeout period, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); + + /** @brief Read an Input report from a HID device. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read and + the handle is in non-blocking mode, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); + + /** @brief Set the device handle to be non-blocking. + + In non-blocking mode calls to hid_read() will return + immediately with a value of 0 if there is no data to be + read. In blocking mode, hid_read() will wait (block) until + there is data to read before returning. + + Nonblocking can be turned on and off at any time. + + @ingroup API + @param device A device handle returned from hid_open(). + @param nonblock enable or not the nonblocking reads + - 1 to enable nonblocking + - 0 to disable nonblocking. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); + + /** @brief Send a Feature report to the device. + + Feature reports are sent over the Control endpoint as a + Set_Report transfer. The first byte of @p data[] must + contain the Report ID. For devices which only support a + single report, this must be set to 0x0. The remaining bytes + contain the report data. Since the Report ID is mandatory, + calls to hid_send_feature_report() will always contain one + more byte than the report contains. For example, if a hid + report is 16 bytes long, 17 bytes must be passed to + hid_send_feature_report(): the Report ID (or 0x0, for + devices which do not use numbered reports), followed by the + report data (16 bytes). In this example, the length passed + in would be 17. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send, including + the report number. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); + + /** @brief Get a feature report from a HID device. + + Set the first byte of @p data[] to the Report ID of the + report to be read. Make sure to allow space for this + extra byte in @p data[]. Upon return, the first byte will + still contain the Report ID, and the report data will + start in data[1]. + + @ingroup API + @param device A device handle returned from hid_open(). + @param data A buffer to put the read data into, including + the Report ID. Set the first byte of @p data[] to the + Report ID of the report to be read, or set it to zero + if your device does not use numbered reports. + @param length The number of bytes to read, including an + extra byte for the report ID. The buffer can be longer + than the actual report. + + @returns + This function returns the number of bytes read plus + one for the report ID (which is still in the first + byte), or -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); + + /** @brief Close a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + */ + void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); + + /** @brief Get The Manufacturer String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Product String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get The Serial Number String from a HID device. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); + + /** @brief Get a string from a HID device, based on its string index. + + @ingroup API + @param device A device handle returned from hid_open(). + @param string_index The index of the string to get. + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); + + /** @brief Get a string describing the last error which occurred. + + @ingroup API + @param device A device handle returned from hid_open(). + + @returns + This function returns a string containing the last error + which occurred or NULL if none has occurred. + */ + HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); + +#ifdef __cplusplus +} +#endif + +#endif + From e5dbe3a96bf246d2a0a07559192bca7bd40c9f45 Mon Sep 17 00:00:00 2001 From: bbkiwi Date: Mon, 17 Jul 2017 01:20:25 +1200 Subject: [PATCH 05/15] Start ADC HPATimer only once. Makes for more stable collection of audio when connected to wifi (especially station mode). However the range of output from the ADC is truncated. TODO fix, or use system_adc_fast_read with wifi off and RF off The devfixes branch of esp82xx needs to be used --- embedded8266/esp82xx | 2 +- embedded8266/user/user_main.c | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 21e23b5..c0fc3a4 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 +Subproject commit c0fc3a450ce5c84ce77809d05d885d4ea304f833 diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 5b5267b..0a2d696 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -131,6 +131,7 @@ static void ICACHE_FLASH_ATTR myTimer(void *arg) { StartHPATimer(); //Init the high speed ADC timer. hpa_running = 1; + hpa_is_paused_for_wifi = 0; // only need to do once prevents unstable ADC } // uart0_sendStr("."); // printf( "%d/%d\n",soundtail,soundhead ); @@ -222,6 +223,12 @@ void ICACHE_FLASH_ATTR user_init(void) ws2812_init(); + // Attempt to make ADC more stable + // https://github.com/esp8266/Arduino/issues/2070 + // see peripherals https://espressif.com/en/support/explore/faq + //wifi_set_sleep_type(NONE_SLEEP_T); // on its own stopped wifi working + //wifi_fpm_set_sleep_type(NONE_SLEEP_T); // with this seemed no difference + system_os_post(procTaskPrio, 0, 0 ); } From bb7c21fcf3a48a7fb1ce06f17e50fbb5e91471b0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Thu, 7 Sep 2017 21:58:22 -0400 Subject: [PATCH 06/15] Bump esp82xx --- embedded8266/esp82xx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 21e23b5..6666ee9 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 21e23b5c360045425abe6c855853f2d973420fc2 +Subproject commit 6666ee94f388b9038fc9382b813287be65c20283 From 4f983efbfe452b87a305dd5d369d0d86fafca2cf Mon Sep 17 00:00:00 2001 From: CNLohr Date: Mon, 11 Sep 2017 02:56:50 -0400 Subject: [PATCH 07/15] Major progress to getting colorchord on Windows TCC Give it a shot. colorchord2/windows/compile.bat. I am having issues getting sound in. --- .gitignore | 2 + colorchord2/DisplayHIDAPI.c | 5 +- colorchord2/DisplayNetwork.c | 6 +- colorchord2/OutputCells.c | 1 - colorchord2/OutputLinear.c | 1 - colorchord2/OutputProminent.c | 1 - colorchord2/default.conf | 2 +- colorchord2/dft.c | 2 + colorchord2/main.c | 14 +- colorchord2/os_generic.c | 42 +- colorchord2/os_generic.h | 12 +- colorchord2/outdrivers.h | 2 +- colorchord2/parameters.h | 3 +- colorchord2/sound.c | 2 +- colorchord2/sound.h | 3 + colorchord2/sound_alsa.c | 2 +- colorchord2/sound_null.c | 3 +- colorchord2/sound_pulse.c | 2 +- colorchord2/sound_win.c | 13 +- colorchord2/util.c | 2 +- colorchord2/windows/32/WS2_32.Lib | Bin 0 -> 346832 bytes colorchord2/windows/32/WinMM.Lib | Bin 0 -> 36976 bytes colorchord2/windows/64/WS2_32.Lib | Bin 0 -> 350088 bytes colorchord2/windows/64/WinMM.Lib | Bin 0 -> 42736 bytes colorchord2/windows/compile.bat | 8 + colorchord2/windows/math.h | 926 +++++++++++ colorchord2/windows/mmsystem.h | 1950 +++++++++++++++++++++++ colorchord2/windows/symbol_enumerator.c | 245 +++ colorchord2/windows/symbol_enumerator.h | 12 + colorchord2/windows/tcc_stubs.c | 80 + colorchord2/windows/winsock2.h | 1303 +++++++++++++++ 31 files changed, 4581 insertions(+), 63 deletions(-) create mode 100644 .gitignore create mode 100644 colorchord2/windows/32/WS2_32.Lib create mode 100644 colorchord2/windows/32/WinMM.Lib create mode 100644 colorchord2/windows/64/WS2_32.Lib create mode 100644 colorchord2/windows/64/WinMM.Lib create mode 100644 colorchord2/windows/compile.bat create mode 100644 colorchord2/windows/math.h create mode 100644 colorchord2/windows/mmsystem.h create mode 100644 colorchord2/windows/symbol_enumerator.c create mode 100644 colorchord2/windows/symbol_enumerator.h create mode 100644 colorchord2/windows/tcc_stubs.c create mode 100644 colorchord2/windows/winsock2.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3841a63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +colorchord2/windows/colorchord.def +colorchord2/colorchord.def \ No newline at end of file diff --git a/colorchord2/DisplayHIDAPI.c b/colorchord2/DisplayHIDAPI.c index 40792a1..5e4dd70 100644 --- a/colorchord2/DisplayHIDAPI.c +++ b/colorchord2/DisplayHIDAPI.c @@ -9,7 +9,6 @@ #include "hidapi.h" #include "color.h" #include -#include struct HIDAPIOutDriver { @@ -58,7 +57,7 @@ static void * LEDOutThread( void * v ) } led->readyFlag = 0; } - usleep(100); + OGUSleep(100); } return 0; } @@ -86,7 +85,7 @@ static void LEDUpdate(void * id, struct NoteFinder*nf) int leds_this_round = 0; int ledbid = 0; - while( led->readyFlag ) usleep(100); + while( led->readyFlag ) OGUSleep(100); int lastledplace = 1; led->last_leds[0] = 0; diff --git a/colorchord2/DisplayNetwork.c b/colorchord2/DisplayNetwork.c index 1a4dac5..deba2d0 100644 --- a/colorchord2/DisplayNetwork.c +++ b/colorchord2/DisplayNetwork.c @@ -9,10 +9,12 @@ #include #include "color.h" #include "DrawFunctions.h" -#include -#ifdef WIN32 +#if defined(WIN32) || defined(WINDOWS) #include +#ifdef TCC +#include +#endif #define MSG_NOSIGNAL 0 #else #include diff --git a/colorchord2/OutputCells.c b/colorchord2/OutputCells.c index 502f985..4f5bee6 100644 --- a/colorchord2/OutputCells.c +++ b/colorchord2/OutputCells.c @@ -12,7 +12,6 @@ #include "color.h" #include #include -#include extern float DeltaFrameTime; extern double Now; diff --git a/colorchord2/OutputLinear.c b/colorchord2/OutputLinear.c index bac98ae..5c3d334 100644 --- a/colorchord2/OutputLinear.c +++ b/colorchord2/OutputLinear.c @@ -12,7 +12,6 @@ #include "color.h" #include #include -#include struct LEDOutDriver { diff --git a/colorchord2/OutputProminent.c b/colorchord2/OutputProminent.c index a9cfb6c..c9f1792 100644 --- a/colorchord2/OutputProminent.c +++ b/colorchord2/OutputProminent.c @@ -11,7 +11,6 @@ #include "color.h" #include #include -#include struct ProminentDriver { diff --git a/colorchord2/default.conf b/colorchord2/default.conf index 6bc9161..41f76a5 100644 --- a/colorchord2/default.conf +++ b/colorchord2/default.conf @@ -18,7 +18,7 @@ play = 0 rec = 1 channels = 2 samplerate = 44100 -wininput = 0 +wininput = 1 #Compiled version will default this. #sound_source = ALSA diff --git a/colorchord2/dft.c b/colorchord2/dft.c index 2ee7174..a28a758 100644 --- a/colorchord2/dft.c +++ b/colorchord2/dft.c @@ -420,7 +420,9 @@ uint16_t Sdatspace[FIXBINS*4]; //(advances,places,isses,icses) static uint8_t Sdo_this_octave[BINCYCLE]; static int16_t Saccum_octavebins[OCTAVES]; static uint8_t Swhichoctaveplace; +#ifndef INCLUDING_EMBEDDED uint16_t embeddedbins[FIXBINS]; //This is updated every time the DFT hits the octavecount, or 1/32 updates. +#endif //From: http://stackoverflow.com/questions/1100090/looking-for-an-efficient-integer-square-root-algorithm-for-arm-thumb2 /** diff --git a/colorchord2/main.c b/colorchord2/main.c index 5d782ac..4136a90 100644 --- a/colorchord2/main.c +++ b/colorchord2/main.c @@ -17,10 +17,11 @@ #include "parameters.h" #include "hook.h" #include "configs.h" +#include struct SoundDriver * sd; -#ifdef WIN32 +#if defined(WIN32) || defined(USE_WINDOWS) #include #define ESCAPE_KEY 0x1B @@ -41,8 +42,8 @@ double Now = 0; int lastfps; short screenx, screeny; -struct DriverInstances * outdriver[MAX_OUT_DRIVERS]; +struct DriverInstances * outdriver[MAX_OUT_DRIVERS]; int headless = 0; REGISTER_PARAM( headless, PAINT ); int set_screenx = 640; REGISTER_PARAM( set_screenx, PAINT ); @@ -159,18 +160,19 @@ void SoundCB( float * out, float * in, int samplesr, int * samplesp, struct Soun *samplesp = samplesr; } - int main(int argc, char ** argv) { int i; - +#ifdef TCC + ManuallyRegisterDevices(); +#endif + printf( "Output Drivers:\n" ); for( i = 0; i < MAX_OUT_DRIVERS; i++ ) { if( ODList[i].Name ) printf( "\t%s\n", ODList[i].Name ); } - -#ifdef WIN32 +#if defined(WIN32) || defined(USE_WINDOWS) WSADATA wsaData; WSAStartup(0x202, &wsaData); diff --git a/colorchord2/os_generic.c b/colorchord2/os_generic.c index effe5eb..da281e3 100644 --- a/colorchord2/os_generic.c +++ b/colorchord2/os_generic.c @@ -2,7 +2,6 @@ #include "os_generic.h" - #ifdef USE_WINDOWS #include @@ -49,15 +48,16 @@ double OGGetFileTime( const char * file ) } -og_thread_t OGCreateThread( void * (function)( void * ), void * parameter ) +og_thread_t OGCreateThread( void * (routine)( void * ), void * parameter ) { - return (og_thread_t)CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)function, parameter, 0, 0 ); + return (og_thread_t)CreateThread( 0, 0, (LPTHREAD_START_ROUTINE)routine, parameter, 0, 0 ); } void * OGJoinThread( og_thread_t ot ) { WaitForSingleObject( ot, INFINITE ); CloseHandle( ot ); + return 0; } void OGCancelThread( og_thread_t ot ) @@ -93,28 +93,23 @@ og_sema_t OGCreateSema() return (og_sema_t)sem; } - - -typedef LONG NTSTATUS; - -typedef NTSTATUS (NTAPI *_NtQuerySemaphore)( - HANDLE SemaphoreHandle, - DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ - PVOID SemaphoreInformation, /* but this is to much to dump here */ - ULONG SemaphoreInformationLength, - PULONG ReturnLength OPTIONAL -); - - -typedef struct _SEMAPHORE_BASIC_INFORMATION { - ULONG CurrentCount; - ULONG MaximumCount; -} SEMAPHORE_BASIC_INFORMATION; - - int OGGetSema( og_sema_t os ) { + typedef LONG NTSTATUS; HANDLE sem = (HANDLE)os; + typedef NTSTATUS (NTAPI *_NtQuerySemaphore)( + HANDLE SemaphoreHandle, + DWORD SemaphoreInformationClass, /* Would be SEMAPHORE_INFORMATION_CLASS */ + PVOID SemaphoreInformation, /* but this is to much to dump here */ + ULONG SemaphoreInformationLength, + PULONG ReturnLength OPTIONAL + ); + + typedef struct _SEMAPHORE_BASIC_INFORMATION { + ULONG CurrentCount; + ULONG MaximumCount; + } SEMAPHORE_BASIC_INFORMATION; + static _NtQuerySemaphore NtQuerySemaphore; SEMAPHORE_BASIC_INFORMATION BasicInfo; @@ -158,9 +153,8 @@ void OGDeleteSema( og_sema_t os ) #else -#ifndef _GNU_SOURCE #define _GNU_SOURCE -#endif + #include #include diff --git a/colorchord2/os_generic.h b/colorchord2/os_generic.h index c7de7db..163f2db 100644 --- a/colorchord2/os_generic.h +++ b/colorchord2/os_generic.h @@ -1,9 +1,8 @@ //Copyright 2015 <>< Charles Lohr under the NewBSD or MIT/x11 License. - #ifndef _OS_GENERIC_H #define _OS_GENERIC_H -#ifdef WIN32 +#if defined( WIN32 ) || defined (WINDOWS) || defined( _WIN32) #define USE_WINDOWS #endif @@ -12,12 +11,7 @@ extern "C" { #endif -#define EXECUTE_AT_BOOT( x, y ) \ - \ - void fn##x() __attribute__((constructor)); \ - void fn##x() \ - { y; } \ - + //Things that shouldn't be macro'd double OGGetAbsoluteTime(); void OGSleep( int is ); @@ -55,7 +49,7 @@ void OGDeleteSema( og_sema_t os ); #endif -//Date Stamp: 2014-06-12 +//Date Stamp: 2012-02-15 /* NOTE: Portions (namely the top section) are part of headers from other diff --git a/colorchord2/outdrivers.h b/colorchord2/outdrivers.h index 60f56ce..db3afce 100644 --- a/colorchord2/outdrivers.h +++ b/colorchord2/outdrivers.h @@ -41,6 +41,6 @@ struct DriverInstances * SetupOutDriver( ); void RegOutDriver( const char * ron, struct DriverInstances * (*Init)( ) ); #define REGISTER_OUT_DRIVER( name ) \ - EXECUTE_AT_BOOT( r##name, RegOutDriver( #name, name ) ); + void REGISTER##name() __attribute__((constructor)) { RegOutDriver( #name, name ); } #endif diff --git a/colorchord2/parameters.h b/colorchord2/parameters.h index f23bacd..b6c2fe2 100644 --- a/colorchord2/parameters.h +++ b/colorchord2/parameters.h @@ -58,8 +58,7 @@ void SetParametersFromString( const char * string ); void AddCallback( const char * name, ParamCallbackT t, void * v ); #define REGISTER_PARAM( parameter_name, type ) \ - void Register##parameter_name() __attribute__((constructor)); \ - void Register##parameter_name() { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } + void REGISTER##parameter_name() __attribute__((constructor)) { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } #endif diff --git a/colorchord2/sound.c b/colorchord2/sound.c index df7ff1c..9f03707 100644 --- a/colorchord2/sound.c +++ b/colorchord2/sound.c @@ -55,7 +55,6 @@ struct SoundDriver * InitSound( const char * driver_name, SoundCBType cb ) { int i; struct SoundDriver * ret = 0; - if( driver_name == 0 || strlen( driver_name ) == 0 ) { //Search for a driver. @@ -74,6 +73,7 @@ struct SoundDriver * InitSound( const char * driver_name, SoundCBType cb ) } else { + printf( "Initializing sound. Recommended driver: %s\n", driver_name ); for( i = 0; i < MAX_SOUND_DRIVERS; i++ ) { if( SoundDrivers[i] == 0 ) diff --git a/colorchord2/sound.h b/colorchord2/sound.h index 0bfe9b9..d83ed9b 100644 --- a/colorchord2/sound.h +++ b/colorchord2/sound.h @@ -34,5 +34,8 @@ void CloseSound( struct SoundDriver * soundobject ); //Called by various sound drivers. Notice priority must be greater than 0. Priority of 0 or less will not register. void RegSound( int priority, const char * name, SoundInitFn * fn ); +#define REGISTER_SOUND( sounddriver, priority, name, function ) \ + void REGISTER##sounddriver() __attribute__((constructor)) { RegSound( priority, name, function ); } + #endif diff --git a/colorchord2/sound_alsa.c b/colorchord2/sound_alsa.c index 64dc720..1161c1e 100644 --- a/colorchord2/sound_alsa.c +++ b/colorchord2/sound_alsa.c @@ -337,5 +337,5 @@ void * InitSoundAlsa( SoundCBType cb ) return InitASound(r); } -EXECUTE_AT_BOOT( AlsaSoundReg, RegSound( 10, "ALSA", InitSoundAlsa ) ); +REGISTER_SOUND( AlsaSound, 10, "ALSA", InitSoundAlsa ); diff --git a/colorchord2/sound_null.c b/colorchord2/sound_null.c index 47d5415..d7f8d16 100644 --- a/colorchord2/sound_null.c +++ b/colorchord2/sound_null.c @@ -41,6 +41,5 @@ void * InitSoundNull( SoundCBType cb ) } - -EXECUTE_AT_BOOT( NullSoundReg, RegSound( 1, "NULL", InitSoundNull ) ); +REGISTER_SOUND( NullSound, 1, "NULL", InitSoundNull ); diff --git a/colorchord2/sound_pulse.c b/colorchord2/sound_pulse.c index 2cecc35..4664c2e 100644 --- a/colorchord2/sound_pulse.c +++ b/colorchord2/sound_pulse.c @@ -374,6 +374,6 @@ fail: -EXECUTE_AT_BOOT( PulseSoundReg, RegSound( 11, "PULSE", InitSoundPulse ) ); +REGISTER_SOUND( PulseSound, 11, "PULSE", InitSoundPulse ); diff --git a/colorchord2/sound_win.c b/colorchord2/sound_win.c index 684e61c..559b87f 100644 --- a/colorchord2/sound_win.c +++ b/colorchord2/sound_win.c @@ -4,9 +4,9 @@ #include "parameters.h" #include "sound.h" #include "os_generic.h" -#include #include #include +#include #if defined(WIN32) #pragma comment(lib,"winmm.lib") @@ -106,7 +106,8 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) { int i; WAVEFORMATEX wfmt; - + memset( &wfmt, 0, sizeof(wfmt) ); + printf ("WFMT Size (debugging temp for TCC): %d\n", sizeof(wfmt) ); if( GetParameterI( "play", 0 ) ) { fprintf( stderr, "Error: This Windows Sound Driver does not support playback.\n" ); @@ -136,7 +137,7 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) int p = waveInOpen(&r->hMyWave, dwdevice, &wfmt,(DWORD)(void*)(&HANDLEMIC) , 0, CALLBACK_FUNCTION); - printf( "WIO: %d\n", p ); //On real windows, returns 11 + printf( "WIO: %d\n", p ); for ( i=0;ihMyWave); - printf( "WIS: %d\n", p ); //On real windows returns 5. + printf( "WIS: %d\n", p ); return r; } @@ -159,7 +160,7 @@ static struct SoundDriverWin * InitWinSound( struct SoundDriverWin * r ) void * InitSoundWin( SoundCBType cb ) { - struct SoundDriverWin * r = malloc( sizeof( struct SoundDriverWin ) ); + struct SoundDriverWin * r = (struct SoundDriverWin *)malloc( sizeof( struct SoundDriverWin ) ); r->CloseFn = CloseSoundWin; r->SoundStateFn = SoundStateWin; @@ -177,5 +178,5 @@ void * InitSoundWin( SoundCBType cb ) return InitWinSound(r); } -EXECUTE_AT_BOOT( WinSoundReg, RegSound( 10, "WIN", InitSoundWin ) ); +REGISTER_SOUND( SoundWin, 10, "WIN", InitSoundWin ); diff --git a/colorchord2/util.c b/colorchord2/util.c index d1e2d4e..9d1c8c4 100644 --- a/colorchord2/util.c +++ b/colorchord2/util.c @@ -2,8 +2,8 @@ //This file may be used in whole or part in any way for any purpose by anyone //without restriction. -#include "util.h" #include +#include "util.h" #include //Take the absolute distance between two points on a torus. diff --git a/colorchord2/windows/32/WS2_32.Lib b/colorchord2/windows/32/WS2_32.Lib new file mode 100644 index 0000000000000000000000000000000000000000..750a539f253150b1a6697f24fe29e2a434bf2798 GIT binary patch literal 346832 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 z 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 ZrA;kV|KM;?caFo=IzzoC`)gEn{69Bsp-BJ$ literal 0 HcmV?d00001 diff --git a/colorchord2/windows/32/WinMM.Lib b/colorchord2/windows/32/WinMM.Lib new file mode 100644 index 0000000000000000000000000000000000000000..7459425118e0c020a72a93d0dbfe9d1fb25dc829 GIT binary patch literal 36976 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 QYcA5per6HFEx@_|2Y9(kjsO4v literal 0 HcmV?d00001 diff --git a/colorchord2/windows/64/WS2_32.Lib b/colorchord2/windows/64/WS2_32.Lib new file mode 100644 index 0000000000000000000000000000000000000000..1ff59346d5d1c662fc250a8c113b7f864fd8707f GIT binary patch literal 350088 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åxH(%=|opP$~}m%9r%TAh_c#!?TUTVsmy3Tgt)cV<~}0=B5#&WKrG}@_d`5 zTz|=4<&yQ;Ea|w+KY47ji(5Dv8Nkn|87X3EZMAZ0xnr`-Jcuo}cyeaGGp84QrCsMI z)60y-(rDkchD#*jjQxVd?>dj+$zeJK)9_%owZ%b{KaRh5LlCHcp9f_? z9ht7LWRb}@KD=Oz&|va%qwvDklPRo>8zWeNj7IBXTU(|$h*j?>d&%gt+;gd0Kb-$J%8h9b#%+n~ z44y1*R6olp@CaH>;#qS}<@!c{*AB(&g?NoN42%J+(T+od@&&6HFJ8M5k9P)E+TD}w zIlYI;G|<8vqR%a`Os2utjA@+0yG!%wTH`QeV<5quuBG`k&W*&sMbacfg#11tzj51Y z3Ge$&EzM(%g#a2@!OUo^2-3$KJF{qaN%pabV zqYa$Eq`ccCO(sB@)4UDVu3fU4jn-_|wq06~u0x(Kb(T8pLVOaXZh4*&!K9Rk$E^r9 zA_2a9<*0OTkKk}_cA(UICW1BA78iZJc{EDL7DjLISzTr$nD=Dd4&|-3!{IwI&YUO4 z=Uon?-<89X1g^(x8fMJX1~jcl4(6mD<)i4tC3@=-zb$E2<8-qt^p6Ql=zGyUG_~%6 zBhI56c^zRAWx0oyFUr7%cqP~Zpq`)$T8~ixxSV~4t&tli!T{_l@$I=Of zVgHCla|)HVbp*D*yR^34oITN=Ta%2+*E|l0o-@a)jP|n?$`z#-ZPt-o4_oP?pyf|iSG{uVlqH{*>BMQT>?bGPy>Hg_BmmE zt3+a+-Mj|>?lk?<#DknEfcV_|UV;7hv6;2`RjNX4k6cEEL2Fp%8YEiuManJj_|u>B zo=6_H!}1B^JEGuL@gmcRyh4KLB|OBRLcgkLtcL-{aXt0JCL^a2G~%hoxBrA=E>AN2 z9gA<_H~a=W-Idi4tKv56Z?GAGeHw)D*1qYsnF^{L>$adVOFPSAwTao zd>Ho|ek!)h>U(AOMDDrUhHU})C)vYWv}$3$WQz1kAdUqdrmf55G`Qcd#^E^0oz;U zsi|;IQ$VBHCuVz0hn#SGUB&l{1+=0&w85`Arjxrv8+@B%oM_MKcbT69eiW3Zyet4X zAD@eS9RJf0K)yf3ehidwgw>ju9G!+81|;MhHt4wsW

xVueL;q#yvh%SbPr&532> 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 Gj{gV3pD!%{ literal 0 HcmV?d00001 diff --git a/colorchord2/windows/64/WinMM.Lib b/colorchord2/windows/64/WinMM.Lib new file mode 100644 index 0000000000000000000000000000000000000000..0c66d272f8ee8561531c9ee7aaaf19fd18731952 GIT binary patch literal 42736 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 literal 0 HcmV?d00001 diff --git a/colorchord2/windows/compile.bat b/colorchord2/windows/compile.bat new file mode 100644 index 0000000..32f1031 --- /dev/null +++ b/colorchord2/windows/compile.bat @@ -0,0 +1,8 @@ +@echo off +echo Unzip https://download.savannah.gnu.org/releases/tinycc/tcc-0.9.26-win64-bin.zip to C:\tcc +set CFLAGS=-v -DHIDAPI -DWINDOWS -DWIN32 -DTCC -DRUNTIME_SYMNUM -Os -Itccinc -DINCLUDING_EMBEDDED -I.. -I. -I../../embeddedcommon -rdynamic -g +set LDFLAGS=-lkernel32 -lgdi32 -luser32 -lsetupapi -ldbghelp -ltcc1 -lwinmm -lws2_32 +set SOURCES=..\chash.c ..\color.c ..\configs.c ..\decompose.c ..\dft.c ..\DisplayNetwork.c ..\DisplayArray.c ..\DisplayHIDAPI.c ..\DisplayOUTDriver.c ..\DisplayPie.c ..\DrawFunctions.c ..\filter.c ..\hidapi.c ..\hook.c ..\main.c ..\os_generic.c ..\outdrivers.c ..\OutputCells.c ..\OutputLinear.c ..\OutputProminent.c ..\OutputVoronoi.c ..\parameters.c ..\sound.c ..\sound_win.c ..\sound_null.c ..\util.c ..\WinDriver.c ..\notefinder.c ..\..\embeddedcommon\DFT32.c tcc_stubs.c symbol_enumerator.c +set ARCH_SPECIFIC=-L32 +@echo on +C:\tcc\tcc %CFLAGS% %ARCH_SPECIFIC% %SOURCES% %LDFLAGS% -o ..\colorchord.exe \ No newline at end of file diff --git a/colorchord2/windows/math.h b/colorchord2/windows/math.h new file mode 100644 index 0000000..cd5ee3d --- /dev/null +++ b/colorchord2/windows/math.h @@ -0,0 +1,926 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the w64 mingw-runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ +#ifndef _MATH_H_ +#define _MATH_H_ + +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#include <_mingw.h> + +struct exception; + +#pragma pack(push,_CRT_PACKING) + +#define _DOMAIN 1 +#define _SING 2 +#define _OVERFLOW 3 +#define _UNDERFLOW 4 +#define _TLOSS 5 +#define _PLOSS 6 + +#ifndef __STRICT_ANSI__ +#ifndef NO_OLDNAMES +#define DOMAIN _DOMAIN +#define SING _SING +#define OVERFLOW _OVERFLOW +#define UNDERFLOW _UNDERFLOW +#define TLOSS _TLOSS +#define PLOSS _PLOSS +#endif +#endif + +#ifndef __STRICT_ANSI__ +#define M_E 2.71828182845904523536 +#define M_LOG2E 1.44269504088896340736 +#define M_LOG10E 0.434294481903251827651 +#define M_LN2 0.693147180559945309417 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.785398163397448309616 +#define M_1_PI 0.318309886183790671538 +#define M_2_PI 0.636619772367581343076 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.707106781186547524401 +#endif + +#ifndef __STRICT_ANSI__ +/* See also float.h */ +#ifndef __MINGW_FPCLASS_DEFINED +#define __MINGW_FPCLASS_DEFINED 1 +#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */ +#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */ +#define _FPCLASS_NINF 0x0004 /* Negative Infinity */ +#define _FPCLASS_NN 0x0008 /* Negative Normal */ +#define _FPCLASS_ND 0x0010 /* Negative Denormal */ +#define _FPCLASS_NZ 0x0020 /* Negative Zero */ +#define _FPCLASS_PZ 0x0040 /* Positive Zero */ +#define _FPCLASS_PD 0x0080 /* Positive Denormal */ +#define _FPCLASS_PN 0x0100 /* Positive Normal */ +#define _FPCLASS_PINF 0x0200 /* Positive Infinity */ +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _EXCEPTION_DEFINED +#define _EXCEPTION_DEFINED + struct _exception { + int type; + char *name; + double arg1; + double arg2; + double retval; + }; +#endif + +#ifndef _COMPLEX_DEFINED +#define _COMPLEX_DEFINED + struct _complex { + double x,y; + }; +#endif + +#define EDOM 33 +#define ERANGE 34 + +#ifndef _HUGE +#ifdef _MSVCRT_ + extern double *_HUGE; +#else + extern double *_imp___HUGE; +#define _HUGE (*_imp___HUGE) +#endif +#endif + +#define HUGE_VAL _HUGE + +#ifndef _CRT_ABS_DEFINED +#define _CRT_ABS_DEFINED + int __cdecl abs(int _X); + long __cdecl labs(long _X); +#endif + double __cdecl acos(double _X); + double __cdecl asin(double _X); + double __cdecl atan(double _X); + double __cdecl atan2(double _Y,double _X); +#ifndef _SIGN_DEFINED +#define _SIGN_DEFINED + _CRTIMP double __cdecl _copysign (double _Number,double _Sign); + _CRTIMP double __cdecl _chgsign (double _X); +#endif + double __cdecl cos(double _X); + double __cdecl cosh(double _X); + double __cdecl exp(double _X); + double __cdecl expm1(double _X); + double __cdecl fabs(double _X); + double __cdecl fmod(double _X,double _Y); + double __cdecl log(double _X); + double __cdecl log10(double _X); + double __cdecl pow(double _X,double _Y); + double __cdecl sin(double _X); + double __cdecl sinh(double _X); + double __cdecl tan(double _X); + double __cdecl tanh(double _X); + double __cdecl sqrt(double _X); +#ifndef _CRT_ATOF_DEFINED +#define _CRT_ATOF_DEFINED + double __cdecl atof(const char *_String); + double __cdecl _atof_l(const char *_String,_locale_t _Locale); +#endif + + _CRTIMP double __cdecl _cabs(struct _complex _ComplexA); + double __cdecl ceil(double _X); + double __cdecl floor(double _X); + double __cdecl frexp(double _X,int *_Y); + double __cdecl _hypot(double _X,double _Y); + _CRTIMP double __cdecl _j0(double _X); + _CRTIMP double __cdecl _j1(double _X); + _CRTIMP double __cdecl _jn(int _X,double _Y); + double __cdecl ldexp(double _X,int _Y); +#ifndef _CRT_MATHERR_DEFINED +#define _CRT_MATHERR_DEFINED + int __cdecl _matherr(struct _exception *_Except); +#endif + double __cdecl modf(double _X,double *_Y); + _CRTIMP double __cdecl _y0(double _X); + _CRTIMP double __cdecl _y1(double _X); + _CRTIMP double __cdecl _yn(int _X,double _Y); + +#if(defined(_X86_) && !defined(__x86_64)) + _CRTIMP int __cdecl _set_SSE2_enable(int _Flag); + /* from libmingwex */ + float __cdecl _hypotf(float _X,float _Y); +#endif + + float frexpf(float _X,int *_Y); + float __cdecl ldexpf(float _X,int _Y); + long double __cdecl ldexpl(long double _X,int _Y); + float __cdecl acosf(float _X); + float __cdecl asinf(float _X); + float __cdecl atanf(float _X); + float __cdecl atan2f(float _X,float _Y); + float __cdecl cosf(float _X); + float __cdecl sinf(float _X); + float __cdecl tanf(float _X); + float __cdecl coshf(float _X); + float __cdecl sinhf(float _X); + float __cdecl tanhf(float _X); + float __cdecl expf(float _X); + float __cdecl expm1f(float _X); + float __cdecl logf(float _X); + float __cdecl log10f(float _X); + float __cdecl modff(float _X,float *_Y); + float __cdecl powf(float _X,float _Y); + float __cdecl sqrtf(float _X); + float __cdecl ceilf(float _X); + float __cdecl floorf(float _X); + float __cdecl fmodf(float _X,float _Y); + float __cdecl _hypotf(float _X,float _Y); + float __cdecl fabsf(float _X); +#if !defined(__ia64__) + /* from libmingwex */ + float __cdecl _copysignf (float _Number,float _Sign); + float __cdecl _chgsignf (float _X); + float __cdecl _logbf(float _X); + float __cdecl _nextafterf(float _X,float _Y); + int __cdecl _finitef(float _X); + int __cdecl _isnanf(float _X); + int __cdecl _fpclassf(float _X); +#endif + +#ifndef __cplusplus + __CRT_INLINE long double __cdecl fabsl (long double x) + { + long double res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } +#define _hypotl(x,y) ((long double)_hypot((double)(x),(double)(y))) +#define _matherrl _matherr + __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign((double)(_Number)); } + __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign((double)(_Number),(double)(_Sign)); } + __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); } + +#if !defined (__ia64__) + __CRT_INLINE float __cdecl fabsf (float x) + { + return fabs(x); + } + + __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); } +#endif +#else + // cplusplus + __CRT_INLINE long double __cdecl fabsl (long double x) + { + long double res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } + __CRT_INLINE long double modfl(long double _X,long double *_Y) { + double _Di,_Df = modf((double)_X,&_Di); + *_Y = (long double)_Di; + return (_Df); + } + __CRT_INLINE long double _chgsignl(long double _Number) { return _chgsign(static_cast(_Number)); } + __CRT_INLINE long double _copysignl(long double _Number,long double _Sign) { return _copysign(static_cast(_Number),static_cast(_Sign)); } + __CRT_INLINE float frexpf(float _X,int *_Y) { return ((float)frexp((double)_X,_Y)); } +#ifndef __ia64__ + __CRT_INLINE float __cdecl fabsf (float x) + { + float res; + __asm__ ("fabs;" : "=t" (res) : "0" (x)); + return res; + } + __CRT_INLINE float __cdecl ldexpf (float x, int expn) { return (float) ldexp (x, expn); } +#ifndef __x86_64 + __CRT_INLINE float acosf(float _X) { return ((float)acos((double)_X)); } + __CRT_INLINE float asinf(float _X) { return ((float)asin((double)_X)); } + __CRT_INLINE float atanf(float _X) { return ((float)atan((double)_X)); } + __CRT_INLINE float atan2f(float _X,float _Y) { return ((float)atan2((double)_X,(double)_Y)); } + __CRT_INLINE float ceilf(float _X) { return ((float)ceil((double)_X)); } + __CRT_INLINE float cosf(float _X) { return ((float)cos((double)_X)); } + __CRT_INLINE float coshf(float _X) { return ((float)cosh((double)_X)); } + __CRT_INLINE float expf(float _X) { return ((float)exp((double)_X)); } + __CRT_INLINE float floorf(float _X) { return ((float)floor((double)_X)); } + __CRT_INLINE float fmodf(float _X,float _Y) { return ((float)fmod((double)_X,(double)_Y)); } + __CRT_INLINE float logf(float _X) { return ((float)log((double)_X)); } + __CRT_INLINE float log10f(float _X) { return ((float)log10((double)_X)); } + __CRT_INLINE float modff(float _X,float *_Y) { + double _Di,_Df = modf((double)_X,&_Di); + *_Y = (float)_Di; + return ((float)_Df); + } + __CRT_INLINE float powf(float _X,float _Y) { return ((float)pow((double)_X,(double)_Y)); } + __CRT_INLINE float sinf(float _X) { return ((float)sin((double)_X)); } + __CRT_INLINE float sinhf(float _X) { return ((float)sinh((double)_X)); } + __CRT_INLINE float sqrtf(float _X) { return ((float)sqrt((double)_X)); } + __CRT_INLINE float tanf(float _X) { return ((float)tan((double)_X)); } + __CRT_INLINE float tanhf(float _X) { return ((float)tanh((double)_X)); } +#endif +#endif +#endif + +#ifndef NO_OLDNAMES +#define matherr _matherr + +#define HUGE _HUGE + /* double __cdecl cabs(struct _complex _X); */ + double __cdecl hypot(double _X,double _Y); + _CRTIMP double __cdecl j0(double _X); + _CRTIMP double __cdecl j1(double _X); + _CRTIMP double __cdecl jn(int _X,double _Y); + _CRTIMP double __cdecl y0(double _X); + _CRTIMP double __cdecl y1(double _X); + _CRTIMP double __cdecl yn(int _X,double _Y); +#endif + +#ifndef __NO_ISOCEXT +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || !defined __STRICT_ANSI__ || defined __GLIBCPP__ + +#define NAN (0.0F/0.0F) +#define HUGE_VALF (1.0F/0.0F) +#define HUGE_VALL (1.0L/0.0L) +#define INFINITY (1.0F/0.0F) + + +#define FP_NAN 0x0100 +#define FP_NORMAL 0x0400 +#define FP_INFINITE (FP_NAN | FP_NORMAL) +#define FP_ZERO 0x4000 +#define FP_SUBNORMAL (FP_NORMAL | FP_ZERO) + /* 0x0200 is signbit mask */ + + + /* + We can't __CRT_INLINE float or double, because we want to ensure truncation + to semantic type before classification. + (A normal long double value might become subnormal when + converted to double, and zero when converted to float.) + */ + + extern int __cdecl __fpclassifyf (float); + extern int __cdecl __fpclassify (double); + extern int __cdecl __fpclassifyl (long double); + +/* Implemented at tcc/tcc_libm.h */ +#define fpclassify(x) (sizeof (x) == sizeof (float) ? __fpclassifyf (x) \ + : sizeof (x) == sizeof (double) ? __fpclassify (x) \ + : __fpclassifyl (x)) + + /* 7.12.3.2 */ +#define isfinite(x) ((fpclassify(x) & FP_NAN) == 0) + + /* 7.12.3.3 */ +#define isinf(x) (fpclassify(x) == FP_INFINITE) + + /* 7.12.3.4 */ + /* We don't need to worry about trucation here: + A NaN stays a NaN. */ +#define isnan(x) (fpclassify(x) == FP_NAN) + + /* 7.12.3.5 */ +#define isnormal(x) (fpclassify(x) == FP_NORMAL) + + /* 7.12.3.6 The signbit macro */ + + extern int __cdecl __signbitf (float); + extern int __cdecl __signbit (double); + extern int __cdecl __signbitl (long double); + +/* Implemented at tcc/tcc_libm.h */ +#define signbit(x) (sizeof (x) == sizeof (float) ? __signbitf (x) \ + : sizeof (x) == sizeof (double) ? __signbit (x) \ + : __signbitl (x)) + + extern double __cdecl exp2(double); + extern float __cdecl exp2f(float); + extern long double __cdecl exp2l(long double); + +#define FP_ILOGB0 ((int)0x80000000) +#define FP_ILOGBNAN ((int)0x80000000) + extern int __cdecl ilogb (double); + extern int __cdecl ilogbf (float); + extern int __cdecl ilogbl (long double); + + extern double __cdecl log1p(double); + extern float __cdecl log1pf(float); + extern long double __cdecl log1pl(long double); + + extern double __cdecl log2 (double); + extern float __cdecl log2f (float); + extern long double __cdecl log2l (long double); + + extern double __cdecl logb (double); + extern float __cdecl logbf (float); + extern long double __cdecl logbl (long double); + + __CRT_INLINE double __cdecl logb (double x) + { + double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + __CRT_INLINE float __cdecl logbf (float x) + { + float res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + __CRT_INLINE long double __cdecl logbl (long double x) + { + long double res; + __asm__ ("fxtract\n\t" + "fstp %%st" : "=t" (res) : "0" (x)); + return res; + } + + extern long double __cdecl modfl (long double, long double*); + + /* 7.12.6.13 */ + extern double __cdecl scalbn (double, int); + extern float __cdecl scalbnf (float, int); + extern long double __cdecl scalbnl (long double, int); + + extern double __cdecl scalbln (double, long); + extern float __cdecl scalblnf (float, long); + extern long double __cdecl scalblnl (long double, long); + + /* 7.12.7.1 */ + /* Implementations adapted from Cephes versions */ + extern double __cdecl cbrt (double); + extern float __cdecl cbrtf (float); + extern long double __cdecl cbrtl (long double); + + __CRT_INLINE float __cdecl hypotf (float x, float y) + { return (float) hypot (x, y);} + extern long double __cdecl hypotl (long double, long double); + + extern long double __cdecl powl (long double, long double); + extern long double __cdecl expl(long double); + extern long double __cdecl expm1l(long double); + extern long double __cdecl coshl(long double); + extern long double __cdecl fabsl (long double); + extern long double __cdecl acosl(long double); + extern long double __cdecl asinl(long double); + extern long double __cdecl atanl(long double); + extern long double __cdecl atan2l(long double,long double); + extern long double __cdecl sinhl(long double); + extern long double __cdecl tanhl(long double); + + /* 7.12.8.1 The erf functions */ + extern double __cdecl erf (double); + extern float __cdecl erff (float); + /* TODO + extern long double __cdecl erfl (long double); + */ + + /* 7.12.8.2 The erfc functions */ + extern double __cdecl erfc (double); + extern float __cdecl erfcf (float); + /* TODO + extern long double __cdecl erfcl (long double); + */ + + /* 7.12.8.3 The lgamma functions */ + extern double __cdecl lgamma (double); + extern float __cdecl lgammaf (float); + extern long double __cdecl lgammal (long double); + + /* 7.12.8.4 The tgamma functions */ + extern double __cdecl tgamma (double); + extern float __cdecl tgammaf (float); + extern long double __cdecl tgammal (long double); + + extern long double __cdecl ceill (long double); + extern long double __cdecl floorl (long double); + extern long double __cdecl frexpl(long double,int *); + extern long double __cdecl log10l(long double); + extern long double __cdecl logl(long double); + extern long double __cdecl cosl(long double); + extern long double __cdecl sinl(long double); + extern long double __cdecl tanl(long double); + extern long double sqrtl(long double); + + /* 7.12.9.3 */ + extern double __cdecl nearbyint ( double); + extern float __cdecl nearbyintf (float); + extern long double __cdecl nearbyintl (long double); + + /* 7.12.9.4 */ + /* round, using fpu control word settings */ + __CRT_INLINE double __cdecl rint (double x) + { + double retval; + __asm__ ( + "fldl %1\n" + "frndint \n" + "fstl %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + __CRT_INLINE float __cdecl rintf (float x) + { + float retval; + __asm__ ( + "flds %1\n" + "frndint \n" + "fsts %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + __CRT_INLINE long double __cdecl rintl (long double x) + { + long double retval; + __asm__ ( + "fldt %1\n" + "frndint \n" + "fstt %0\n" : "=m" (retval) : "m" (x)); + return retval; + } + + /* 7.12.9.5 */ + __CRT_INLINE long __cdecl lrint (double x) + { + long retval; + __asm__ __volatile__ \ + ("fldl %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long __cdecl lrintf (float x) + { + long retval; + __asm__ __volatile__ \ + ("flds %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long __cdecl lrintl (long double x) + { + long retval; + __asm__ __volatile__ \ + ("fldt %1\n" \ + "fistpl %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrint (double x) + { + long long retval; + __asm__ __volatile__ \ + ("fldl %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrintf (float x) + { + long long retval; + __asm__ __volatile__ \ + ("flds %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + __CRT_INLINE long long __cdecl llrintl (long double x) + { + long long retval; + __asm__ __volatile__ \ + ("fldt %1\n" \ + "fistpll %0" : "=m" (retval) : "m" (x)); \ + return retval; + } + + #define FE_TONEAREST 0x0000 + #define FE_DOWNWARD 0x0400 + #define FE_UPWARD 0x0800 + #define FE_TOWARDZERO 0x0c00 + + __CRT_INLINE double trunc (double _x) + { + double retval; + unsigned short saved_cw; + unsigned short tmp_cw; + __asm__ ("fnstcw %0;" : "=m" (saved_cw)); /* save FPU control word */ + tmp_cw = (saved_cw & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)) + | FE_TOWARDZERO; + __asm__ ("fldcw %0;" : : "m" (tmp_cw)); + __asm__ ("fldl %1;" + "frndint;" + "fstl %0;" : "=m" (retval) : "m" (_x)); /* round towards zero */ + __asm__ ("fldcw %0;" : : "m" (saved_cw) ); /* restore saved control word */ + return retval; + } + + /* 7.12.9.6 */ + /* round away from zero, regardless of fpu control word settings */ + extern double __cdecl round (double); + extern float __cdecl roundf (float); + extern long double __cdecl roundl (long double); + + /* 7.12.9.7 */ + extern long __cdecl lround (double); + extern long __cdecl lroundf (float); + extern long __cdecl lroundl (long double); + + extern long long __cdecl llround (double); + extern long long __cdecl llroundf (float); + extern long long __cdecl llroundl (long double); + + /* 7.12.9.8 */ + /* round towards zero, regardless of fpu control word settings */ + extern double __cdecl trunc (double); + extern float __cdecl truncf (float); + extern long double __cdecl truncl (long double); + + extern long double __cdecl fmodl (long double, long double); + + /* 7.12.10.2 */ + extern double __cdecl remainder (double, double); + extern float __cdecl remainderf (float, float); + extern long double __cdecl remainderl (long double, long double); + + /* 7.12.10.3 */ + extern double __cdecl remquo(double, double, int *); + extern float __cdecl remquof(float, float, int *); + extern long double __cdecl remquol(long double, long double, int *); + + /* 7.12.11.1 */ + extern double __cdecl copysign (double, double); /* in libmoldname.a */ + extern float __cdecl copysignf (float, float); + extern long double __cdecl copysignl (long double, long double); + + /* 7.12.11.2 Return a NaN */ + extern double __cdecl nan(const char *tagp); + extern float __cdecl nanf(const char *tagp); + extern long double __cdecl nanl(const char *tagp); + +#ifndef __STRICT_ANSI__ +#define _nan() nan("") +#define _nanf() nanf("") +#define _nanl() nanl("") +#endif + + /* 7.12.11.3 */ + extern double __cdecl nextafter (double, double); /* in libmoldname.a */ + extern float __cdecl nextafterf (float, float); + extern long double __cdecl nextafterl (long double, long double); + + /* 7.12.11.4 The nexttoward functions: TODO */ + + /* 7.12.12.1 */ + /* x > y ? (x - y) : 0.0 */ + extern double __cdecl fdim (double x, double y); + extern float __cdecl fdimf (float x, float y); + extern long double __cdecl fdiml (long double x, long double y); + + /* fmax and fmin. + NaN arguments are treated as missing data: if one argument is a NaN + and the other numeric, then these functions choose the numeric + value. */ + + /* 7.12.12.2 */ + extern double __cdecl fmax (double, double); + extern float __cdecl fmaxf (float, float); + extern long double __cdecl fmaxl (long double, long double); + + /* 7.12.12.3 */ + extern double __cdecl fmin (double, double); + extern float __cdecl fminf (float, float); + extern long double __cdecl fminl (long double, long double); + + /* 7.12.13.1 */ + /* return x * y + z as a ternary op */ + extern double __cdecl fma (double, double, double); + extern float __cdecl fmaf (float, float, float); + extern long double __cdecl fmal (long double, long double, long double); + + +#if 0 // gr: duplicate, see below + /* 7.12.14 */ + /* + * With these functions, comparisons involving quiet NaNs set the FP + * condition code to "unordered". The IEEE floating-point spec + * dictates that the result of floating-point comparisons should be + * false whenever a NaN is involved, with the exception of the != op, + * which always returns true: yes, (NaN != NaN) is true). + */ + +#if __GNUC__ >= 3 + +#define isgreater(x, y) __builtin_isgreater(x, y) +#define isgreaterequal(x, y) __builtin_isgreaterequal(x, y) +#define isless(x, y) __builtin_isless(x, y) +#define islessequal(x, y) __builtin_islessequal(x, y) +#define islessgreater(x, y) __builtin_islessgreater(x, y) +#define isunordered(x, y) __builtin_isunordered(x, y) + +#else + /* helper */ + __CRT_INLINE int __cdecl + __fp_unordered_compare (long double x, long double y){ + unsigned short retval; + __asm__ ("fucom %%st(1);" + "fnstsw;": "=a" (retval) : "t" (x), "u" (y)); + return retval; + } + +#define isgreater(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0) +#define isless(x, y) ((__fp_unordered_compare (y, x) \ + & 0x4500) == 0) +#define isgreaterequal(x, y) ((__fp_unordered_compare (x, y) \ + & FP_INFINITE) == 0) +#define islessequal(x, y) ((__fp_unordered_compare(y, x) \ + & FP_INFINITE) == 0) +#define islessgreater(x, y) ((__fp_unordered_compare(x, y) \ + & FP_SUBNORMAL) == 0) +#define isunordered(x, y) ((__fp_unordered_compare(x, y) \ + & 0x4500) == 0x4500) + +#endif +#endif //0 + + +#endif /* __STDC_VERSION__ >= 199901L */ +#endif /* __NO_ISOCEXT */ + +#ifdef __cplusplus +} +extern "C++" { + template inline _Ty _Pow_int(_Ty _X,int _Y) { + unsigned int _N; + if(_Y >= 0) _N = (unsigned int)_Y; + else _N = (unsigned int)(-_Y); + for(_Ty _Z = _Ty(1);;_X *= _X) { + if((_N & 1)!=0) _Z *= _X; + if((_N >>= 1)==0) return (_Y < 0 ? _Ty(1) / _Z : _Z); + } + } +} +#endif + +#pragma pack(pop) + +/* 7.12.14 */ +/* + * With these functions, comparisons involving quiet NaNs set the FP + * condition code to "unordered". The IEEE floating-point spec + * dictates that the result of floating-point comparisons should be + * false whenever a NaN is involved, with the exception of the != op, + * which always returns true: yes, (NaN != NaN) is true). + */ + +/* Mini libm (inline __fpclassify*, __signbit* and variants) */ + +/* TCC uses 8 bytes for double and long double, so effectively the l variants + * are never used. For now, they just run the normal (double) variant. + */ + +/* + * most of the code in this file is taken from MUSL rs-1.0 (MIT license) + * - musl-libc: http://git.musl-libc.org/cgit/musl/tree/src/math?h=rs-1.0 + * - License: http://git.musl-libc.org/cgit/musl/tree/COPYRIGHT?h=rs-1.0 + */ + +/******************************************************************************* + Start of code based on MUSL +*******************************************************************************/ +/* +musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2014 Rich Felker, et al. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------------------------------------- +*/ + +/* fpclassify */ + +__CRT_INLINE int __cdecl __fpclassify (double x) { + union {double f; uint64_t i;} u = {x}; + int e = u.i>>52 & 0x7ff; + if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; + if (e==0x7ff) return u.i<<12 ? FP_NAN : FP_INFINITE; + return FP_NORMAL; +} + +__CRT_INLINE int __cdecl __fpclassifyf (float x) { + union {float f; uint32_t i;} u = {x}; + int e = u.i>>23 & 0xff; + if (!e) return u.i<<1 ? FP_SUBNORMAL : FP_ZERO; + if (e==0xff) return u.i<<9 ? FP_NAN : FP_INFINITE; + return FP_NORMAL; +} + +__CRT_INLINE int __cdecl __fpclassifyl (long double x) { + return __fpclassify(x); +} + + +/* signbit */ + +__CRT_INLINE int __cdecl __signbit (double x) { + union {double d; uint64_t i;} y = { x }; + return y.i>>63; +} + +__CRT_INLINE int __cdecl __signbitf (float x) { + union {float f; uint32_t i; } y = { x }; + return y.i>>31; +} + +__CRT_INLINE int __cdecl __signbitl (long double x) { + return __signbit(x); +} + + +/* fmin*, fmax* */ + +#define TCCFP_FMIN_EVAL (isnan(x) ? y : \ + isnan(y) ? x : \ + (signbit(x) != signbit(y)) ? (signbit(x) ? x : y) : \ + x < y ? x : y) + +__CRT_INLINE double __cdecl fmin (double x, double y) { + return TCCFP_FMIN_EVAL; +} + +__CRT_INLINE float __cdecl fminf (float x, float y) { + return TCCFP_FMIN_EVAL; +} + +__CRT_INLINE long double __cdecl fminl (long double x, long double y) { + return TCCFP_FMIN_EVAL; +} + +#define TCCFP_FMAX_EVAL (isnan(x) ? y : \ + isnan(y) ? x : \ + (signbit(x) != signbit(y)) ? (signbit(x) ? y : x) : \ + x < y ? y : x) + +__CRT_INLINE double __cdecl fmax (double x, double y) { + return TCCFP_FMAX_EVAL; +} + +__CRT_INLINE float __cdecl fmaxf (float x, float y) { + return TCCFP_FMAX_EVAL; +} + +__CRT_INLINE long double __cdecl fmaxl (long double x, long double y) { + return TCCFP_FMAX_EVAL; +} + + +/* *round* */ + +#define TCCFP_FORCE_EVAL(x) do { \ +if (sizeof(x) == sizeof(float)) { \ + volatile float __x; \ + __x = (x); \ +} else if (sizeof(x) == sizeof(double)) { \ + volatile double __x; \ + __x = (x); \ +} else { \ + volatile long double __x; \ + __x = (x); \ +} \ +} while(0) + +__CRT_INLINE double __cdecl round (double x) { + union {double f; uint64_t i;} u = {x}; + int e = u.i >> 52 & 0x7ff; + double y; + + if (e >= 0x3ff+52) + return x; + if (u.i >> 63) + x = -x; + if (e < 0x3ff-1) { + /* raise inexact if x!=0 */ + TCCFP_FORCE_EVAL(x + 0x1p52); + return 0*u.f; + } + y = (double)(x + 0x1p52) - 0x1p52 - x; + if (y > 0.5) + y = y + x - 1; + else if (y <= -0.5) + y = y + x + 1; + else + y = y + x; + if (u.i >> 63) + y = -y; + return y; +} + +__CRT_INLINE long __cdecl lround (double x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llround (double x) { + return round(x); +} + +__CRT_INLINE float __cdecl roundf (float x) { + return round(x); +} + +__CRT_INLINE long __cdecl lroundf (float x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llroundf (float x) { + return round(x); +} + +__CRT_INLINE long double __cdecl roundl (long double x) { + return round(x); +} + +__CRT_INLINE long __cdecl lroundl (long double x) { + return round(x); +} + +__CRT_INLINE long long __cdecl llroundl (long double x) { + return round(x); +} + + + +#endif /* End _MATH_H_ */ + diff --git a/colorchord2/windows/mmsystem.h b/colorchord2/windows/mmsystem.h new file mode 100644 index 0000000..3eb06a4 --- /dev/null +++ b/colorchord2/windows/mmsystem.h @@ -0,0 +1,1950 @@ + +#ifndef _MMSYSTEM_H +#define _MMSYSTEM_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif +#pragma pack(push,1) +#ifdef __cplusplus +extern "C" { +#endif + +#if defined( TCC ) || defined (TinyCC) || defined(TINYCC) +#define _STRUCT_NAME(x) x +typedef UINT* LPUINT; +#endif + +#define WINMMAPI DECLSPEC_IMPORT +#define _loadds +#define _huge +#define MAXPNAMELEN 32 +#define MAXERRORLENGTH 256 +#define MAX_JOYSTICKOEMVXDNAME 260 +#define _MMRESULT_ +#define TIME_MS 1 +#define TIME_SAMPLES 2 +#define TIME_BYTES 4 +#define TIME_SMPTE 8 +#define TIME_MIDI 16 +#define TIME_TICKS 32 +#define MAKEFOURCC(c0,c1,c2,c3) ((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)|((DWORD)(BYTE)(c2)<<16)|((DWORD)(BYTE)(c3)<<24)) +#ifndef mmioFOURCC +#define mmioFOURCC(c0,c1,c2,c3) MAKEFOURCC(c0,c1,c2,c3) +#endif +#define MM_JOY1MOVE 0x3A0 +#define MM_JOY2MOVE 0x3A1 +#define MM_JOY1ZMOVE 0x3A2 +#define MM_JOY2ZMOVE 0x3A3 +#define MM_JOY1BUTTONDOWN 0x3B5 +#define MM_JOY2BUTTONDOWN 0x3B6 +#define MM_JOY1BUTTONUP 0x3B7 +#define MM_JOY2BUTTONUP 0x3B8 +#define MM_MCINOTIFY 0x3B9 +#define MM_WOM_OPEN 0x3BB +#define MM_WOM_CLOSE 0x3BC +#define MM_WOM_DONE 0x3BD +#define MM_WIM_OPEN 0x3BE +#define MM_WIM_CLOSE 0x3BF +#define MM_WIM_DATA 0x3C0 +#define MM_MIM_OPEN 0x3C1 +#define MM_MIM_CLOSE 0x3C2 +#define MM_MIM_DATA 0x3C3 +#define MM_MIM_LONGDATA 0x3C4 +#define MM_MIM_ERROR 0x3C5 +#define MM_MIM_LONGERROR 0x3C6 +#define MM_MOM_OPEN 0x3C7 +#define MM_MOM_CLOSE 0x3C8 +#define MM_MOM_DONE 0x3C9 +#define MM_DRVM_OPEN 0x3D0 +#define MM_DRVM_CLOSE 0x3D1 +#define MM_DRVM_DATA 0x3D2 +#define MM_DRVM_ERROR 0x3D3 +#define MM_STREAM_OPEN 0x3D4 +#define MM_STREAM_CLOSE 0x3D5 +#define MM_STREAM_DONE 0x3D6 +#define MM_STREAM_ERROR 0x3D7 +#define MM_MOM_POSITIONCB 0x3CA +#define MM_MCISIGNAL 0x3CB +#define MM_MIM_MOREDATA 0x3CC +#define MM_MIXM_LINE_CHANGE 0x3D0 +#define MM_MIXM_CONTROL_CHANGE 0x3D1 +#define MMSYSERR_BASE 0 +#define WAVERR_BASE 32 +#define MIDIERR_BASE 64 +#define TIMERR_BASE 96 +#define JOYERR_BASE 160 +#define MCIERR_BASE 256 +#define MIXERR_BASE 1024 +#define MCI_STRING_OFFSET 512 +#define MCI_VD_OFFSET 1024 +#define MCI_CD_OFFSET 1088 +#define MCI_WAVE_OFFSET 1152 +#define MCI_SEQ_OFFSET 1216 +#define MMSYSERR_NOERROR 0 +#define MMSYSERR_ERROR (MMSYSERR_BASE+1) +#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE+2) +#define MMSYSERR_NOTENABLED (MMSYSERR_BASE+3) +#define MMSYSERR_ALLOCATED (MMSYSERR_BASE+4) +#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE+5) +#define MMSYSERR_NODRIVER (MMSYSERR_BASE+6) +#define MMSYSERR_NOMEM (MMSYSERR_BASE+7) +#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE+8) +#define MMSYSERR_BADERRNUM (MMSYSERR_BASE+9) +#define MMSYSERR_INVALFLAG (MMSYSERR_BASE+10) +#define MMSYSERR_INVALPARAM (MMSYSERR_BASE+11) +#define MMSYSERR_HANDLEBUSY (MMSYSERR_BASE+12) +#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE+13) +#define MMSYSERR_BADDB (MMSYSERR_BASE+14) +#define MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE+15) +#define MMSYSERR_READERROR (MMSYSERR_BASE+16) +#define MMSYSERR_WRITEERROR (MMSYSERR_BASE+17) +#define MMSYSERR_DELETEERROR (MMSYSERR_BASE+18) +#define MMSYSERR_VALNOTFOUND (MMSYSERR_BASE+19) +#define MMSYSERR_NODRIVERCB (MMSYSERR_BASE+20) +#define MMSYSERR_LASTERROR (MMSYSERR_BASE+20) +#define DRV_LOAD 1 +#define DRV_ENABLE 2 +#define DRV_OPEN 3 +#define DRV_CLOSE 4 +#define DRV_DISABLE 5 +#define DRV_FREE 6 +#define DRV_CONFIGURE 7 +#define DRV_QUERYCONFIGURE 8 +#define DRV_INSTALL 9 +#define DRV_REMOVE 10 +#define DRV_EXITSESSION 11 +#define DRV_POWER 15 +#define DRV_RESERVED 0x800 +#define DRV_USER 0x4000 +#define DRVCNF_CANCEL 0 +#define DRVCNF_OK 1 +#define DRVCNF_RESTART 2 +#define DRV_CANCEL DRVCNF_CANCEL +#define DRV_OK DRVCNF_OK +#define DRV_RESTART DRVCNF_RESTART +#define DRV_MCI_FIRST DRV_RESERVED +#define DRV_MCI_LAST (DRV_RESERVED+0xFFF) +#define CALLBACK_TYPEMASK 0x70000 +#define CALLBACK_NULL 0 +#define CALLBACK_WINDOW 0x10000 +#define CALLBACK_TASK 0x20000 +#define CALLBACK_FUNCTION 0x30000 +#define CALLBACK_THREAD CALLBACK_TASK +#define CALLBACK_EVENT 0x50000 +#define SND_SYNC 0 +#define SND_ASYNC 1 +#define SND_NODEFAULT 2 +#define SND_MEMORY 4 +#define SND_LOOP 8 +#define SND_NOSTOP 16 +#define SND_NOWAIT 0x2000 +#define SND_ALIAS 0x10000 +#define SND_ALIAS_ID 0x110000 +#define SND_FILENAME 0x20000 +#define SND_RESOURCE 0x40004 +#define SND_PURGE 0x40 +#define SND_APPLICATION 0x80 +#define SND_ALIAS_START 0 +#define sndAlias(c0,c1) (SND_ALIAS_START+(DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)) +#define SND_ALIAS_SYSTEMASTERISK sndAlias('S','*') +#define SND_ALIAS_SYSTEMQUESTION sndAlias('S','?') +#define SND_ALIAS_SYSTEMHAND sndAlias('S','H') +#define SND_ALIAS_SYSTEMEXIT sndAlias('S','E') +#define SND_ALIAS_SYSTEMSTART sndAlias('S','S') +#define SND_ALIAS_SYSTEMWELCOME sndAlias('S','W') +#define SND_ALIAS_SYSTEMEXCLAMATION sndAlias('S','!') +#define SND_ALIAS_SYSTEMDEFAULT sndAlias('S','D') +#define WAVERR_BADFORMAT (WAVERR_BASE + 0) +#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) +#define WAVERR_UNPREPARED (WAVERR_BASE + 2) +#define WAVERR_SYNC (WAVERR_BASE + 3) +#define WAVERR_LASTERROR (WAVERR_BASE + 3) +#define WOM_OPEN MM_WOM_OPEN +#define WOM_CLOSE MM_WOM_CLOSE +#define WOM_DONE MM_WOM_DONE +#define WIM_OPEN MM_WIM_OPEN +#define WIM_CLOSE MM_WIM_CLOSE +#define WIM_DATA MM_WIM_DATA +#define WAVE_MAPPER ((UINT)-1) +#define WAVE_FORMAT_QUERY 1 +#define WAVE_ALLOWSYNC 2 +#define WAVE_MAPPED 4 +#define WAVE_FORMAT_DIRECT 8 +#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY|WAVE_FORMAT_DIRECT) +#define WHDR_DONE 1 +#define WHDR_PREPARED 2 +#define WHDR_BEGINLOOP 4 +#define WHDR_ENDLOOP 8 +#define WHDR_INQUEUE 16 +#define WAVECAPS_PITCH 1 +#define WAVECAPS_PLAYBACKRATE 2 +#define WAVECAPS_VOLUME 4 +#define WAVECAPS_LRVOLUME 8 +#define WAVECAPS_SYNC 16 +#define WAVECAPS_SAMPLEACCURATE 32 +#define WAVECAPS_DIRECTSOUND 64 +#define WAVE_INVALIDFORMAT 0 +#define WAVE_FORMAT_1M08 1 +#define WAVE_FORMAT_1S08 2 +#define WAVE_FORMAT_1M16 4 +#define WAVE_FORMAT_1S16 8 +#define WAVE_FORMAT_2M08 16 +#define WAVE_FORMAT_2S08 32 +#define WAVE_FORMAT_2M16 64 +#define WAVE_FORMAT_2S16 128 +#define WAVE_FORMAT_4M08 256 +#define WAVE_FORMAT_4S08 512 +#define WAVE_FORMAT_4M16 1024 +#define WAVE_FORMAT_4S16 2048 +#define WAVE_FORMAT_PCM 1 +#define WAVE_FORMAT_EXTENSIBLE 0xFFFE +#define MIDIERR_UNPREPARED MIDIERR_BASE +#define MIDIERR_STILLPLAYING (MIDIERR_BASE+1) +#define MIDIERR_NOMAP (MIDIERR_BASE+2) +#define MIDIERR_NOTREADY (MIDIERR_BASE+3) +#define MIDIERR_NODEVICE (MIDIERR_BASE+4) +#define MIDIERR_INVALIDSETUP (MIDIERR_BASE+5) +#define MIDIERR_BADOPENMODE (MIDIERR_BASE+6) +#define MIDIERR_DONT_CONTINUE (MIDIERR_BASE+7) +#define MIDIERR_LASTERROR (MIDIERR_BASE+7) +#define MIDIPATCHSIZE 128 +#define MIM_OPEN MM_MIM_OPEN +#define MIM_CLOSE MM_MIM_CLOSE +#define MIM_DATA MM_MIM_DATA +#define MIM_LONGDATA MM_MIM_LONGDATA +#define MIM_ERROR MM_MIM_ERROR +#define MIM_LONGERROR MM_MIM_LONGERROR +#define MOM_OPEN MM_MOM_OPEN +#define MOM_CLOSE MM_MOM_CLOSE +#define MOM_DONE MM_MOM_DONE +#define MIM_MOREDATA MM_MIM_MOREDATA +#define MOM_POSITIONCB MM_MOM_POSITIONCB +#define MIDIMAPPER ((UINT)-1) +#define MIDI_MAPPER ((UINT)-1) +#define MIDI_IO_STATUS 32 +#define MIDI_CACHE_ALL 1 +#define MIDI_CACHE_BESTFIT 2 +#define MIDI_CACHE_QUERY 3 +#define MIDI_UNCACHE 4 +#define MOD_MIDIPORT 1 +#define MOD_SYNTH 2 +#define MOD_SQSYNTH 3 +#define MOD_FMSYNTH 4 +#define MOD_MAPPER 5 +#define MIDICAPS_VOLUME 1 +#define MIDICAPS_LRVOLUME 2 +#define MIDICAPS_CACHE 4 +#define MIDICAPS_STREAM 8 +#define MHDR_DONE 1 +#define MHDR_PREPARED 2 +#define MHDR_INQUEUE 4 +#define MHDR_ISSTRM 8 +#define MEVT_F_SHORT 0 +#define MEVT_F_LONG 0x80000000 +#define MEVT_F_CALLBACK 0x40000000 +#define MEVT_EVENTTYPE(x) ((BYTE)(((x)>>24)&0xFF)) +#define MEVT_EVENTPARM(x) ((DWORD)((x)&0xFFFFFFL)) +#define MEVT_SHORTMSG 0 +#define MEVT_TEMPO 1 +#define MEVT_NOP 2 +#define MEVT_LONGMSG ((BYTE)0x80) +#define MEVT_COMMENT ((BYTE)0x82) +#define MEVT_VERSION ((BYTE)0x84) +#define MIDISTRM_ERROR (-2) +#define MIDIPROP_SET 0x80000000 +#define MIDIPROP_GET 0x40000000 +#define MIDIPROP_TIMEDIV 1 +#define MIDIPROP_TEMPO 2 +#define AUX_MAPPER ((UINT)-1) +#define AUXCAPS_CDAUDIO 1 +#define AUXCAPS_AUXIN 2 +#define AUXCAPS_VOLUME 1 +#define AUXCAPS_LRVOLUME 2 +#define MIXER_SHORT_NAME_CHARS 16 +#define MIXER_LONG_NAME_CHARS 64 +#define MIXERR_INVALLINE MIXERR_BASE +#define MIXERR_INVALCONTROL (MIXERR_BASE+1) +#define MIXERR_INVALVALUE (MIXERR_BASE+2) +#define MIXERR_LASTERROR (MIXERR_BASE+2) +#define MIXER_OBJECTF_HANDLE 0x80000000 +#define MIXER_OBJECTF_MIXER 0 +#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER) +#define MIXER_OBJECTF_WAVEOUT 0x10000000 +#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT) +#define MIXER_OBJECTF_WAVEIN 0x20000000 +#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN) +#define MIXER_OBJECTF_MIDIOUT 0x30000000 +#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT) +#define MIXER_OBJECTF_MIDIIN 0x40000000 +#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN) +#define MIXER_OBJECTF_AUX 0x50000000 +#define MIXERLINE_LINEF_ACTIVE 1 +#define MIXERLINE_LINEF_DISCONNECTED 0x8000 +#define MIXERLINE_LINEF_SOURCE 0x80000000 +#define MIXERLINE_COMPONENTTYPE_DST_FIRST 0 +#define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED MIXERLINE_COMPONENTTYPE_DST_FIRST +#define MIXERLINE_COMPONENTTYPE_DST_DIGITAL (MIXERLINE_COMPONENTTYPE_DST_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_DST_LINE (MIXERLINE_COMPONENTTYPE_DST_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_DST_MONITOR (MIXERLINE_COMPONENTTYPE_DST_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (MIXERLINE_COMPONENTTYPE_DST_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (MIXERLINE_COMPONENTTYPE_DST_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (MIXERLINE_COMPONENTTYPE_DST_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_DST_VOICEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_DST_LAST (MIXERLINE_COMPONENTTYPE_DST_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_FIRST 0x1000 +#define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED MIXERLINE_COMPONENTTYPE_SRC_FIRST +#define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (MIXERLINE_COMPONENTTYPE_SRC_FIRST+1) +#define MIXERLINE_COMPONENTTYPE_SRC_LINE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+2) +#define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+3) +#define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+4) +#define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST+5) +#define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST+6) +#define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (MIXERLINE_COMPONENTTYPE_SRC_FIRST+7) +#define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT (MIXERLINE_COMPONENTTYPE_SRC_FIRST+8) +#define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (MIXERLINE_COMPONENTTYPE_SRC_FIRST+9) +#define MIXERLINE_COMPONENTTYPE_SRC_ANALOG (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_COMPONENTTYPE_SRC_LAST (MIXERLINE_COMPONENTTYPE_SRC_FIRST+10) +#define MIXERLINE_TARGETTYPE_UNDEFINED 0 +#define MIXERLINE_TARGETTYPE_WAVEOUT 1 +#define MIXERLINE_TARGETTYPE_WAVEIN 2 +#define MIXERLINE_TARGETTYPE_MIDIOUT 3 +#define MIXERLINE_TARGETTYPE_MIDIIN 4 +#define MIXERLINE_TARGETTYPE_AUX 5 +#define MIXER_GETLINEINFOF_DESTINATION 0 +#define MIXER_GETLINEINFOF_SOURCE 1 +#define MIXER_GETLINEINFOF_LINEID 2 +#define MIXER_GETLINEINFOF_COMPONENTTYPE 3 +#define MIXER_GETLINEINFOF_TARGETTYPE 4 +#define MIXER_GETLINEINFOF_QUERYMASK 15 +#define MIXERCONTROL_CONTROLF_UNIFORM 1 +#define MIXERCONTROL_CONTROLF_MULTIPLE 2 +#define MIXERCONTROL_CONTROLF_DISABLED 0x80000000 +#define MIXERCONTROL_CT_CLASS_MASK 0xF0000000 +#define MIXERCONTROL_CT_CLASS_CUSTOM 0 +#define MIXERCONTROL_CT_CLASS_METER 0x10000000 +#define MIXERCONTROL_CT_CLASS_SWITCH 0x20000000 +#define MIXERCONTROL_CT_CLASS_NUMBER 0x30000000 +#define MIXERCONTROL_CT_CLASS_SLIDER 0x40000000 +#define MIXERCONTROL_CT_CLASS_FADER 0x50000000 +#define MIXERCONTROL_CT_CLASS_TIME 0x60000000 +#define MIXERCONTROL_CT_CLASS_LIST 0x70000000 +#define MIXERCONTROL_CT_SUBCLASS_MASK 0xF000000 +#define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN 0 +#define MIXERCONTROL_CT_SC_SWITCH_BUTTON 0x1000000 +#define MIXERCONTROL_CT_SC_METER_POLLED 0 +#define MIXERCONTROL_CT_SC_TIME_MICROSECS 0 +#define MIXERCONTROL_CT_SC_TIME_MILLISECS 0x1000000 +#define MIXERCONTROL_CT_SC_LIST_SINGLE 0 +#define MIXERCONTROL_CT_SC_LIST_MULTIPLE 0x1000000 +#define MIXERCONTROL_CT_UNITS_MASK 0xFF0000 +#define MIXERCONTROL_CT_UNITS_CUSTOM 0 +#define MIXERCONTROL_CT_UNITS_BOOLEAN 0x10000 +#define MIXERCONTROL_CT_UNITS_SIGNED 0x20000 +#define MIXERCONTROL_CT_UNITS_UNSIGNED 0x30000 +#define MIXERCONTROL_CT_UNITS_DECIBELS 0x40000 +#define MIXERCONTROL_CT_UNITS_PERCENT 0x50000 +#define MIXERCONTROL_CONTROLTYPE_CUSTOM (MIXERCONTROL_CT_CLASS_CUSTOM|MIXERCONTROL_CT_UNITS_CUSTOM) +#define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PEAKMETER (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER+1) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER (MIXERCONTROL_CT_CLASS_METER|MIXERCONTROL_CT_SC_METER_POLLED|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_BOOLEAN (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BOOLEAN|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_ONOFF (MIXERCONTROL_CONTROLTYPE_BOOLEAN+1) +#define MIXERCONTROL_CONTROLTYPE_MUTE (MIXERCONTROL_CONTROLTYPE_BOOLEAN+2) +#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN+3) +#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN+4) +#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN+5) +#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH|MIXERCONTROL_CT_SC_SWITCH_BUTTON|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_DECIBELS) +#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_UNSIGNED (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_PERCENT (MIXERCONTROL_CT_CLASS_NUMBER|MIXERCONTROL_CT_UNITS_PERCENT) +#define MIXERCONTROL_CONTROLTYPE_SLIDER (MIXERCONTROL_CT_CLASS_SLIDER|MIXERCONTROL_CT_UNITS_SIGNED) +#define MIXERCONTROL_CONTROLTYPE_PAN (MIXERCONTROL_CONTROLTYPE_SLIDER+1) +#define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN (MIXERCONTROL_CONTROLTYPE_SLIDER+2) +#define MIXERCONTROL_CONTROLTYPE_FADER (MIXERCONTROL_CT_CLASS_FADER|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_VOLUME (MIXERCONTROL_CONTROLTYPE_FADER+1) +#define MIXERCONTROL_CONTROLTYPE_BASS (MIXERCONTROL_CONTROLTYPE_FADER+2) +#define MIXERCONTROL_CONTROLTYPE_TREBLE (MIXERCONTROL_CONTROLTYPE_FADER+3) +#define MIXERCONTROL_CONTROLTYPE_EQUALIZER (MIXERCONTROL_CONTROLTYPE_FADER+4) +#define MIXERCONTROL_CONTROLTYPE_SINGLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_SINGLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MUX (MIXERCONTROL_CONTROLTYPE_SINGLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST|MIXERCONTROL_CT_SC_LIST_MULTIPLE|MIXERCONTROL_CT_UNITS_BOOLEAN) +#define MIXERCONTROL_CONTROLTYPE_MIXER (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT+1) +#define MIXERCONTROL_CONTROLTYPE_MICROTIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MICROSECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXERCONTROL_CONTROLTYPE_MILLITIME (MIXERCONTROL_CT_CLASS_TIME|MIXERCONTROL_CT_SC_TIME_MILLISECS|MIXERCONTROL_CT_UNITS_UNSIGNED) +#define MIXER_GETLINECONTROLSF_ALL 0 +#define MIXER_GETLINECONTROLSF_ONEBYID 1 +#define MIXER_GETLINECONTROLSF_ONEBYTYPE 2 +#define MIXER_GETLINECONTROLSF_QUERYMASK 15 +#define MIXER_GETCONTROLDETAILSF_VALUE 0 +#define MIXER_GETCONTROLDETAILSF_LISTTEXT 1 +#define MIXER_GETCONTROLDETAILSF_QUERYMASK 15 +#define MIXER_SETCONTROLDETAILSF_VALUE 0 +#define MIXER_SETCONTROLDETAILSF_CUSTOM 1 +#define MIXER_SETCONTROLDETAILSF_QUERYMASK 15 +#define TIMERR_NOERROR 0 +#define TIMERR_NOCANDO (TIMERR_BASE+1) +#define TIMERR_STRUCT (TIMERR_BASE+33) +#define TIME_ONESHOT 0 +#define TIME_PERIODIC 1 +#define TIME_CALLBACK_FUNCTION 0 +#define TIME_CALLBACK_EVENT_SET 16 +#define TIME_CALLBACK_EVENT_PULSE 32 +#if (WINVER >= 0x0501) +#define TIME_KILL_SYNCHRONOUS 0x0100 +#endif +#define JOYERR_NOERROR (0) +#define JOYERR_PARMS (JOYERR_BASE+5) +#define JOYERR_NOCANDO (JOYERR_BASE+6) +#define JOYERR_UNPLUGGED (JOYERR_BASE+7) +#define JOY_BUTTON1 1 +#define JOY_BUTTON2 2 +#define JOY_BUTTON3 4 +#define JOY_BUTTON4 8 +#define JOY_BUTTON1CHG 256 +#define JOY_BUTTON2CHG 512 +#define JOY_BUTTON3CHG 1024 +#define JOY_BUTTON4CHG 2048 +#define JOY_BUTTON5 257 +#define JOY_BUTTON6 513 +#define JOY_BUTTON7 1025 +#define JOY_BUTTON8 2049 +#define JOY_BUTTON9 256 +#define JOY_BUTTON10 512 +#define JOY_BUTTON11 1024 +#define JOY_BUTTON12 2048 +#define JOY_BUTTON13 4096 +#define JOY_BUTTON14 8192 +#define JOY_BUTTON15 16384 +#define JOY_BUTTON16 32768 +#define JOY_BUTTON17 65536 +#define JOY_BUTTON18 0x20000 +#define JOY_BUTTON19 0x40000 +#define JOY_BUTTON20 0x80000 +#define JOY_BUTTON21 0x100000 +#define JOY_BUTTON22 0x200000 +#define JOY_BUTTON23 0x400000 +#define JOY_BUTTON24 0x800000 +#define JOY_BUTTON25 0x1000000 +#define JOY_BUTTON26 0x2000000 +#define JOY_BUTTON27 0x4000000 +#define JOY_BUTTON28 0x8000000 +#define JOY_BUTTON29 0x10000000 +#define JOY_BUTTON30 0x20000000 +#define JOY_BUTTON31 0x40000000 +#define JOY_BUTTON32 0x80000000 +#define JOY_POVCENTERED ((WORD)-1) +#define JOY_POVFORWARD 0 +#define JOY_POVRIGHT 9000 +#define JOY_POVBACKWARD 18000 +#define JOY_POVLEFT 27000 +#define JOY_RETURNX 1 +#define JOY_RETURNY 2 +#define JOY_RETURNZ 4l +#define JOY_RETURNR 8 +#define JOY_RETURNU 16 +#define JOY_RETURNV 32 +#define JOY_RETURNPOV 64 +#define JOY_RETURNBUTTONS 128 +#define JOY_RETURNRAWDATA 256 +#define JOY_RETURNPOVCTS 512 +#define JOY_RETURNCENTERED 1024 +#define JOY_USEDEADZONE 2048 +#define JOY_RETURNALL (JOY_RETURNX|JOY_RETURNY|JOY_RETURNZ|JOY_RETURNR|JOY_RETURNU|JOY_RETURNV|JOY_RETURNPOV|JOY_RETURNBUTTONS) +#define JOY_CAL_READALWAYS 0x10000 +#define JOY_CAL_READXYONLY 0x20000 +#define JOY_CAL_READ3 0x40000 +#define JOY_CAL_READ4 0x80000 +#define JOY_CAL_READXONLY 0x100000 +#define JOY_CAL_READYONLY 0x200000 +#define JOY_CAL_READ5 0x400000 +#define JOY_CAL_READ6 0x800000 +#define JOY_CAL_READZONLY 0x1000000 +#define JOY_CAL_READRONLY 0x2000000 +#define JOY_CAL_READUONLY 0x4000000 +#define JOY_CAL_READVONLY 0x8000000 +#define JOYSTICKID1 0 +#define JOYSTICKID2 1 +#define JOYCAPS_HASZ 1 +#define JOYCAPS_HASR 2 +#define JOYCAPS_HASU 4 +#define JOYCAPS_HASV 8 +#define JOYCAPS_HASPOV 16 +#define JOYCAPS_POV4DIR 32 +#define JOYCAPS_POVCTS 64 +#define MMIOERR_BASE 256 +#define MMIOERR_FILENOTFOUND (MMIOERR_BASE+1) +#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE+2) +#define MMIOERR_CANNOTOPEN (MMIOERR_BASE+3) +#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE+4) +#define MMIOERR_CANNOTREAD (MMIOERR_BASE+5) +#define MMIOERR_CANNOTWRITE (MMIOERR_BASE+6) +#define MMIOERR_CANNOTSEEK (MMIOERR_BASE+7) +#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE+8) +#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE+9) +#define MMIOERR_UNBUFFERED (MMIOERR_BASE+10) +#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE+11) +#define MMIOERR_ACCESSDENIED (MMIOERR_BASE+12) +#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE+13) +#define MMIOERR_NETWORKERROR (MMIOERR_BASE+14) +#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE+15) +#define MMIOERR_INVALIDFILE (MMIOERR_BASE+16) +#define CFSEPCHAR '+' +#define MMIO_RWMODE 3 +#define MMIO_SHAREMODE 0x70 +#define MMIO_CREATE 0x1000 +#define MMIO_PARSE 256 +#define MMIO_DELETE 512 +#define MMIO_EXIST 0x4000 +#define MMIO_ALLOCBUF 0x10000 +#define MMIO_GETTEMP 0x20000 +#define MMIO_DIRTY 0x10000000 +#define MMIO_READ 0 +#define MMIO_WRITE 1 +#define MMIO_READWRITE 2 +#define MMIO_COMPAT 0 +#define MMIO_EXCLUSIVE 16 +#define MMIO_DENYWRITE 32 +#define MMIO_DENYREAD 0x30 +#define MMIO_DENYNONE 64 +#define MMIO_FHOPEN 16 +#define MMIO_EMPTYBUF 16 +#define MMIO_TOUPPER 16 +#define MMIO_INSTALLPROC 0x10000 +#define MMIO_GLOBALPROC 0x10000000 +#define MMIO_REMOVEPROC 0x20000 +#define MMIO_UNICODEPROC 0x1000000 +#define MMIO_FINDPROC 0x40000 +#define MMIO_FINDCHUNK 16 +#define MMIO_FINDRIFF 32 +#define MMIO_FINDLIST 64 +#define MMIO_CREATERIFF 32 +#define MMIO_CREATELIST 64 +#define MMIOM_READ MMIO_READ +#define MMIOM_WRITE MMIO_WRITE +#define MMIOM_SEEK 2 +#define MMIOM_OPEN 3 +#define MMIOM_CLOSE 4 +#define MMIOM_WRITEFLUSH 5 +#define MMIOM_RENAME 6 +#define MMIOM_USER 0x8000 +#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F') +#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T') +#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ') +#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ') +#define MMIO_DEFAULTBUFFER 8192 +#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE+1) +#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE+3) +#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE+5) +#define MCIERR_HARDWARE (MCIERR_BASE+6) +#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE+7) +#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE+8) +#define MCIERR_DEVICE_OPEN (MCIERR_BASE+9) +#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE+10) +#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE+11) +#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE+12) +#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE+13) +#define MCIERR_BAD_INTEGER (MCIERR_BASE+14) +#define MCIERR_PARSER_INTERNAL (MCIERR_BASE+15) +#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE+16) +#define MCIERR_MISSING_PARAMETER (MCIERR_BASE+17) +#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE+18) +#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE+19) +#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE+20) +#define MCIERR_INTERNAL (MCIERR_BASE+21) +#define MCIERR_DRIVER (MCIERR_BASE+22) +#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE+23) +#define MCIERR_MULTIPLE (MCIERR_BASE+24) +#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE+25) +#define MCIERR_OUTOFRANGE (MCIERR_BASE+26) +#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE+28) +#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE+30) +#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE+31) +#define MCIERR_DEVICE_LOCKED (MCIERR_BASE+32) +#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE+33) +#define MCIERR_BAD_CONSTANT (MCIERR_BASE+34) +#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE+35) +#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE+36) +#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE+37) +#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE+38) +#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE+39) +#define MCIERR_INVALID_FILE (MCIERR_BASE+40) +#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE+41) +#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE+42) +#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE+43) +#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE+44) +#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE+45) +#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE+46) +#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE+47) +#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE+48) +#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE+49) +#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE+50) +#define MCIERR_GET_CD (MCIERR_BASE+51) +#define MCIERR_SET_CD (MCIERR_BASE+52) +#define MCIERR_SET_DRIVE (MCIERR_BASE+53) +#define MCIERR_DEVICE_LENGTH (MCIERR_BASE+54) +#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE+55) +#define MCIERR_NO_INTEGER (MCIERR_BASE+56) +#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE+64) +#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE+65) +#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE+66) +#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE+67) +#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE+68) +#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE+69) +#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE+70) +#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE+71) +#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE+72) +#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE+73) +#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE+80) +#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE+81) +#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE+82) +#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE+83) +#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE+84) +#define MCIERR_SEQ_TIMER (MCIERR_BASE+85) +#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE+86) +#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE+87) +#define MCIERR_NO_WINDOW (MCIERR_BASE+90) +#define MCIERR_CREATEWINDOW (MCIERR_BASE+91) +#define MCIERR_FILE_READ (MCIERR_BASE+92) +#define MCIERR_FILE_WRITE (MCIERR_BASE+93) +#define MCIERR_NO_IDENTITY (MCIERR_BASE+94) +#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE+256) +#define MCI_FIRST DRV_MCI_FIRST +#define MCI_OPEN 0x803 +#define MCI_CLOSE 0x804 +#define MCI_ESCAPE 0x805 +#define MCI_PLAY 0x806 +#define MCI_SEEK 0x807 +#define MCI_STOP 0x808 +#define MCI_PAUSE 0x809 +#define MCI_INFO 0x80A +#define MCI_GETDEVCAPS 0x80B +#define MCI_SPIN 0x80C +#define MCI_SET 0x80D +#define MCI_STEP 0x80E +#define MCI_RECORD 0x80F +#define MCI_SYSINFO 0x810 +#define MCI_BREAK 0x811 +#define MCI_SAVE 0x813 +#define MCI_STATUS 0x814 +#define MCI_CUE 0x830 +#define MCI_REALIZE 0x840 +#define MCI_WINDOW 0x841 +#define MCI_PUT 0x842 +#define MCI_WHERE 0x843 +#define MCI_FREEZE 0x844 +#define MCI_UNFREEZE 0x845 +#define MCI_LOAD 0x850 +#define MCI_CUT 0x851 +#define MCI_COPY 0x852 +#define MCI_PASTE 0x853 +#define MCI_UPDATE 0x854 +#define MCI_RESUME 0x855 +#define MCI_DELETE 0x856 +#define MCI_USER_MESSAGES (DRV_MCI_FIRST+0x400) +#define MCI_LAST 0xFFF +#define MCI_ALL_DEVICE_ID ((MCIDEVICEID)-1) +#define MCI_DEVTYPE_VCR 513 +#define MCI_DEVTYPE_VIDEODISC 514 +#define MCI_DEVTYPE_OVERLAY 515 +#define MCI_DEVTYPE_CD_AUDIO 516 +#define MCI_DEVTYPE_DAT 517 +#define MCI_DEVTYPE_SCANNER 518 +#define MCI_DEVTYPE_ANIMATION 519 +#define MCI_DEVTYPE_DIGITAL_VIDEO 520 +#define MCI_DEVTYPE_OTHER 521 +#define MCI_DEVTYPE_WAVEFORM_AUDIO 522 +#define MCI_DEVTYPE_SEQUENCER 523 +#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR +#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER +#define MCI_DEVTYPE_FIRST_USER 0x1000 +#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET+12) +#define MCI_MODE_STOP (MCI_STRING_OFFSET+13) +#define MCI_MODE_PLAY (MCI_STRING_OFFSET+14) +#define MCI_MODE_RECORD (MCI_STRING_OFFSET+15) +#define MCI_MODE_SEEK (MCI_STRING_OFFSET+16) +#define MCI_MODE_PAUSE (MCI_STRING_OFFSET+17) +#define MCI_MODE_OPEN (MCI_STRING_OFFSET+18) +#define MCI_FORMAT_MILLISECONDS 0 +#define MCI_FORMAT_HMS 1 +#define MCI_FORMAT_MSF 2 +#define MCI_FORMAT_FRAMES 3 +#define MCI_FORMAT_SMPTE_24 4 +#define MCI_FORMAT_SMPTE_25 5 +#define MCI_FORMAT_SMPTE_30 6 +#define MCI_FORMAT_SMPTE_30DROP 7 +#define MCI_FORMAT_BYTES 8 +#define MCI_FORMAT_SAMPLES 9 +#define MCI_FORMAT_TMSF 10 +#define MCI_MSF_MINUTE(t) ((BYTE)(t)) +#define MCI_MSF_SECOND(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_MSF_FRAME(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_MSF(m,s,f) ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16))) +#define MCI_TMSF_TRACK(t) ((BYTE)(t)) +#define MCI_TMSF_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_TMSF_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_TMSF_FRAME(t) ((BYTE)((t)>>24)) +#define MCI_MAKE_TMSF(t,m,s,f) ((DWORD)(((BYTE)(t)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s)|((WORD)(f)<<8))<<16))) +#define MCI_HMS_HOUR(t) ((BYTE)(t)) +#define MCI_HMS_MINUTE(t) ((BYTE)(((WORD)(t))>>8)) +#define MCI_HMS_SECOND(t) ((BYTE)((t)>>16)) +#define MCI_MAKE_HMS(h,m,s) ((DWORD)(((BYTE)(h)|((WORD)(m)<<8))|(((DWORD)(BYTE)(s))<<16))) +#define MCI_NOTIFY_SUCCESSFUL 1 +#define MCI_NOTIFY_SUPERSEDED 2 +#define MCI_NOTIFY_ABORTED 4 +#define MCI_NOTIFY_FAILURE 8 +#define MCI_NOTIFY 1 +#define MCI_WAIT 2 +#define MCI_FROM 4 +#define MCI_TO 8 +#define MCI_TRACK 16 +#define MCI_OPEN_SHAREABLE 256 +#define MCI_OPEN_ELEMENT 512 +#define MCI_OPEN_ALIAS 1024 +#define MCI_OPEN_ELEMENT_ID 2048 +#define MCI_OPEN_TYPE_ID 0x1000 +#define MCI_OPEN_TYPE 0x2000 +#define MCI_SEEK_TO_START 256 +#define MCI_SEEK_TO_END 512 +#define MCI_STATUS_ITEM 256 +#define MCI_STATUS_START 512 +#define MCI_STATUS_LENGTH 1 +#define MCI_STATUS_POSITION 2 +#define MCI_STATUS_NUMBER_OF_TRACKS 3 +#define MCI_STATUS_MODE 4 +#define MCI_STATUS_MEDIA_PRESENT 5 +#define MCI_STATUS_TIME_FORMAT 6 +#define MCI_STATUS_READY 7 +#define MCI_STATUS_CURRENT_TRACK 8 +#define MCI_INFO_PRODUCT 256 +#define MCI_INFO_FILE 512 +#define MCI_INFO_MEDIA_UPC 1024 +#define MCI_INFO_MEDIA_IDENTITY 2048 +#define MCI_INFO_NAME 0x1000 +#define MCI_INFO_COPYRIGHT 0x2000 +#define MCI_GETDEVCAPS_ITEM 256 +#define MCI_GETDEVCAPS_CAN_RECORD 1 +#define MCI_GETDEVCAPS_HAS_AUDIO 2 +#define MCI_GETDEVCAPS_HAS_VIDEO 3 +#define MCI_GETDEVCAPS_DEVICE_TYPE 4 +#define MCI_GETDEVCAPS_USES_FILES 5 +#define MCI_GETDEVCAPS_COMPOUND_DEVICE 6 +#define MCI_GETDEVCAPS_CAN_EJECT 7 +#define MCI_GETDEVCAPS_CAN_PLAY 8 +#define MCI_GETDEVCAPS_CAN_SAVE 9 +#define MCI_SYSINFO_QUANTITY 256 +#define MCI_SYSINFO_OPEN 512 +#define MCI_SYSINFO_NAME 1024 +#define MCI_SYSINFO_INSTALLNAME 2048 +#define MCI_SET_DOOR_OPEN 256 +#define MCI_SET_DOOR_CLOSED 512 +#define MCI_SET_TIME_FORMAT 1024 +#define MCI_SET_AUDIO 2048 +#define MCI_SET_VIDEO 0x1000 +#define MCI_SET_ON 0x2000 +#define MCI_SET_OFF 0x4000 +#define MCI_SET_AUDIO_ALL 0 +#define MCI_SET_AUDIO_LEFT 1 +#define MCI_SET_AUDIO_RIGHT 2 +#define MCI_BREAK_KEY 256 +#define MCI_BREAK_HWND 512 +#define MCI_BREAK_OFF 1024 +#define MCI_RECORD_INSERT 256 +#define MCI_RECORD_OVERWRITE 512 +#define MCI_SAVE_FILE 256 +#define MCI_LOAD_FILE 256 +#define MCI_VD_MODE_PARK (MCI_VD_OFFSET+1) +#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET+2) +#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET+3) +#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET+4) +#define MCI_VD_FORMAT_TRACK 0x4001 +#define MCI_VD_PLAY_REVERSE 0x10000 +#define MCI_VD_PLAY_FAST 0x20000 +#define MCI_VD_PLAY_SPEED 0x40000 +#define MCI_VD_PLAY_SCAN 0x80000 +#define MCI_VD_PLAY_SLOW 0x100000 +#define MCI_VD_SEEK_REVERSE 0x10000 +#define MCI_VD_STATUS_SPEED 0x4002 +#define MCI_VD_STATUS_FORWARD 0x4003 +#define MCI_VD_STATUS_MEDIA_TYPE 0x4004 +#define MCI_VD_STATUS_SIDE 0x4005 +#define MCI_VD_STATUS_DISC_SIZE 0x4006 +#define MCI_VD_GETDEVCAPS_CLV 0x10000 +#define MCI_VD_GETDEVCAPS_CAV 0x20000 +#define MCI_VD_SPIN_UP 0x10000 +#define MCI_VD_SPIN_DOWN 0x20000 +#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x4002 +#define MCI_VD_GETDEVCAPS_FAST_RATE 0x4003 +#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x4004 +#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x4005 +#define MCI_VD_STEP_FRAMES 0x10000 +#define MCI_VD_STEP_REVERSE 0x20000 +#define MCI_VD_ESCAPE_STRING 256 +#define MCI_CDA_STATUS_TYPE_TRACK 0x4001 +#define MCI_CDA_TRACK_AUDIO MCI_CD_OFFSET +#define MCI_CDA_TRACK_OTHER (MCI_CD_OFFSET+1) +#define MCI_WAVE_PCM MCI_WAVE_OFFSET +#define MCI_WAVE_MAPPER (MCI_WAVE_OFFSET+1) +#define MCI_WAVE_OPEN_BUFFER 0x10000 +#define MCI_WAVE_SET_FORMATTAG 0x10000 +#define MCI_WAVE_SET_CHANNELS 0x20000 +#define MCI_WAVE_SET_SAMPLESPERSEC 0x40000 +#define MCI_WAVE_SET_AVGBYTESPERSEC 0x80000 +#define MCI_WAVE_SET_BLOCKALIGN 0x100000 +#define MCI_WAVE_SET_BITSPERSAMPLE 0x200000 +#define MCI_WAVE_INPUT 0x400000 +#define MCI_WAVE_OUTPUT 0x800000 +#define MCI_WAVE_STATUS_FORMATTAG 0x4001 +#define MCI_WAVE_STATUS_CHANNELS 0x4002 +#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x4003 +#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x4004 +#define MCI_WAVE_STATUS_BLOCKALIGN 0x4005 +#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x4006 +#define MCI_WAVE_STATUS_LEVEL 0x4007 +#define MCI_WAVE_SET_ANYINPUT 0x4000000 +#define MCI_WAVE_SET_ANYOUTPUT 0x8000000 +#define MCI_WAVE_GETDEVCAPS_INPUTS 0x4001 +#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x4002 +#define MCI_SEQ_DIV_PPQN MCI_SEQ_OFFSET +#define MCI_SEQ_DIV_SMPTE_24 (MCI_SEQ_OFFSET+1) +#define MCI_SEQ_DIV_SMPTE_25 (MCI_SEQ_OFFSET+2) +#define MCI_SEQ_DIV_SMPTE_30DROP (MCI_SEQ_OFFSET+3) +#define MCI_SEQ_DIV_SMPTE_30 (MCI_SEQ_OFFSET+4) +#define MCI_SEQ_FORMAT_SONGPTR 0x4001 +#define MCI_SEQ_FILE 0x4002 +#define MCI_SEQ_MIDI 0x4003 +#define MCI_SEQ_SMPTE 0x4004 +#define MCI_SEQ_NONE 65533 +#define MCI_SEQ_MAPPER 65535 +#define MCI_SEQ_STATUS_TEMPO 0x4002 +#define MCI_SEQ_STATUS_PORT 0x4003 +#define MCI_SEQ_STATUS_SLAVE 0x4007 +#define MCI_SEQ_STATUS_MASTER 0x4008 +#define MCI_SEQ_STATUS_OFFSET 0x4009 +#define MCI_SEQ_STATUS_DIVTYPE 0x400A +#define MCI_SEQ_STATUS_NAME 0x400B +#define MCI_SEQ_STATUS_COPYRIGHT 0x400C +#define MCI_SEQ_SET_TEMPO 0x10000 +#define MCI_SEQ_SET_PORT 0x20000 +#define MCI_SEQ_SET_SLAVE 0x40000 +#define MCI_SEQ_SET_MASTER 0x80000 +#define MCI_SEQ_SET_OFFSET 0x1000000 +#define MCI_ANIM_OPEN_WS 0x10000 +#define MCI_ANIM_OPEN_PARENT 0x20000 +#define MCI_ANIM_OPEN_NOSTATIC 0x40000 +#define MCI_ANIM_PLAY_SPEED 0x10000 +#define MCI_ANIM_PLAY_REVERSE 0x20000 +#define MCI_ANIM_PLAY_FAST 0x40000 +#define MCI_ANIM_PLAY_SLOW 0x80000 +#define MCI_ANIM_PLAY_SCAN 0x100000 +#define MCI_ANIM_STEP_REVERSE 0x10000 +#define MCI_ANIM_STEP_FRAMES 0x20000 +#define MCI_ANIM_STATUS_SPEED 0x4001 +#define MCI_ANIM_STATUS_FORWARD 0x4002 +#define MCI_ANIM_STATUS_HWND 0x4003 +#define MCI_ANIM_STATUS_HPAL 0x4004 +#define MCI_ANIM_STATUS_STRETCH 0x4005 +#define MCI_ANIM_INFO_TEXT 0x10000 +#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x4001 +#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x4002 +#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x4003 +#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x4004 +#define MCI_ANIM_GETDEVCAPS_PALETTES 0x4006 +#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x4007 +#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x4008 +#define MCI_ANIM_REALIZE_NORM 0x10000 +#define MCI_ANIM_REALIZE_BKGD 0x20000 +#define MCI_ANIM_WINDOW_HWND 0x10000 +#define MCI_ANIM_WINDOW_STATE 0x40000 +#define MCI_ANIM_WINDOW_TEXT 0x80000 +#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_ANIM_WINDOW_DEFAULT 0xL +#define MCI_ANIM_RECT 0x10000 +#define MCI_ANIM_PUT_SOURCE 0x20000 +#define MCI_ANIM_PUT_DESTINATION 0x40000 +#define MCI_ANIM_WHERE_SOURCE 0x20000 +#define MCI_ANIM_WHERE_DESTINATION 0x40000 +#define MCI_ANIM_UPDATE_HDC 0x20000 +#define MCI_OVLY_OPEN_WS 0x10000 +#define MCI_OVLY_OPEN_PARENT 0x20000 +#define MCI_OVLY_STATUS_HWND 0x4001 +#define MCI_OVLY_STATUS_STRETCH 0x4002 +#define MCI_OVLY_INFO_TEXT 0x10000 +#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x4001 +#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x4002 +#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x4003 +#define MCI_OVLY_WINDOW_HWND 0x10000 +#define MCI_OVLY_WINDOW_STATE 0x40000 +#define MCI_OVLY_WINDOW_TEXT 0x80000 +#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x100000 +#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x200000 +#define MCI_OVLY_WINDOW_DEFAULT 0xL +#define MCI_OVLY_RECT 0x10000 +#define MCI_OVLY_PUT_SOURCE 0x20000 +#define MCI_OVLY_PUT_DESTINATION 0x40000 +#define MCI_OVLY_PUT_FRAME 0x80000 +#define MCI_OVLY_PUT_VIDEO 0x100000 +#define MCI_OVLY_WHERE_SOURCE 0x20000 +#define MCI_OVLY_WHERE_DESTINATION 0x40000 +#define MCI_OVLY_WHERE_FRAME 0x80000 +#define MCI_OVLY_WHERE_VIDEO 0x100000 +#define NEWTRANSPARENT 3 +#define QUERYROPSUPPORT 40 +#define SELECTDIB 41 +#define DIBINDEX(n) MAKELONG((n),0x10FF) +#define SC_SCREENSAVE 0xF140 +#define CAPS1 94 +#define C1_TRANSPARENT 1 +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +typedef DWORD MCIERROR; +typedef UINT MCIDEVICEID; +typedef UINT(CALLBACK *YIELDPROC)(MCIDEVICEID,DWORD); +typedef UINT MMVERSION; +typedef UINT MMRESULT; +typedef struct mmtime_tag { + UINT wType; + union { + DWORD ms; + DWORD sample; + DWORD cb; + DWORD ticks; + struct { + BYTE hour; + BYTE min; + BYTE sec; + BYTE frame; + BYTE fps; + BYTE dummy; + BYTE pad[2]; + } smpte; + struct { + DWORD songptrpos; + } midi; + } u; +} MMTIME,*PMMTIME,*LPMMTIME; +DECLARE_HANDLE(HDRVR); +typedef struct tagDRVCONFIGINFO { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; +} DRVCONFIGINFO,*PDRVCONFIGINFO,*LPDRVCONFIGINFO; +typedef struct DRVCONFIGINFOEX { + DWORD dwDCISize; + LPCWSTR lpszDCISectionName; + LPCWSTR lpszDCIAliasName; + DWORD dnDevNode; +} DRVCONFIGINFOEX,*PDRVCONFIGINFOEX,*LPDRVCONFIGINFOEX; +typedef LRESULT(CALLBACK* DRIVERPROC)(DWORD,HDRVR,UINT,LPARAM,LPARAM); +typedef void (CALLBACK DRVCALLBACK)(HDRVR,UINT,DWORD,DWORD,DWORD); +typedef DRVCALLBACK *LPDRVCALLBACK; +typedef DRVCALLBACK *PDRVCALLBACK; +DECLARE_HANDLE(HWAVE); +DECLARE_HANDLE(HWAVEIN); +DECLARE_HANDLE(HWAVEOUT); +typedef HWAVEIN *LPHWAVEIN; +typedef HWAVEOUT *LPHWAVEOUT; +typedef DRVCALLBACK WAVECALLBACK; +typedef WAVECALLBACK *LPWAVECALLBACK; +typedef struct wavehdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + DWORD dwLoops; + struct wavehdr_tag *lpNext; + DWORD reserved; +} WAVEHDR,*PWAVEHDR,*LPWAVEHDR; +typedef struct tagWAVEOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSA,*PWAVEOUTCAPSA,*LPWAVEOUTCAPSA; +typedef struct tagWAVEOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; + DWORD dwSupport; +} WAVEOUTCAPSW,*PWAVEOUTCAPSW,*LPWAVEOUTCAPSW; +typedef struct tagWAVEINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSA,*PWAVEINCAPSA,*LPWAVEINCAPSA; +typedef struct tagWAVEINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwFormats; + WORD wChannels; + WORD wReserved1; +} WAVEINCAPSW,*PWAVEINCAPSW,*LPWAVEINCAPSW; +typedef struct waveformat_tag { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; +} WAVEFORMAT,*PWAVEFORMAT,*LPWAVEFORMAT; +typedef struct pcmwaveformat_tag { + WAVEFORMAT wf; + WORD wBitsPerSample; +} PCMWAVEFORMAT, *PPCMWAVEFORMAT,*LPPCMWAVEFORMAT; +#ifndef _LPCWAVEFORMATEX_DEFINED +#define _LPCWAVEFORMATEX_DEFINED +#define _WAVEFORMATEX_ +typedef struct tWAVEFORMATEX { + WORD wFormatTag; + WORD nChannels; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wBitsPerSample; + WORD cbSize; +} WAVEFORMATEX,*PWAVEFORMATEX,*LPWAVEFORMATEX; +typedef const WAVEFORMATEX *LPCWAVEFORMATEX; +#endif +DECLARE_HANDLE(HMIDI); +DECLARE_HANDLE(HMIDIIN); +DECLARE_HANDLE(HMIDIOUT); +DECLARE_HANDLE(HMIDISTRM); +typedef HMIDI *LPHMIDI; +typedef HMIDIIN *LPHMIDIIN; +typedef HMIDIOUT *LPHMIDIOUT; +typedef HMIDISTRM *LPHMIDISTRM; +typedef DRVCALLBACK MIDICALLBACK; +typedef MIDICALLBACK *LPMIDICALLBACK; +typedef WORD PATCHARRAY[MIDIPATCHSIZE]; +typedef WORD *LPPATCHARRAY; +typedef WORD KEYARRAY[MIDIPATCHSIZE]; +typedef WORD *LPKEYARRAY; +typedef struct tagMIDIOUTCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSA,*PMIDIOUTCAPSA,*LPMIDIOUTCAPSA; +typedef struct tagMIDIOUTCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wVoices; + WORD wNotes; + WORD wChannelMask; + DWORD dwSupport; +} MIDIOUTCAPSW,*PMIDIOUTCAPSW,*LPMIDIOUTCAPSW; +typedef struct tagMIDIINCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSA,*PMIDIINCAPSA,*LPMIDIINCAPSA; +typedef struct tagMIDIINCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD dwSupport; +} MIDIINCAPSW,*PMIDIINCAPSW,*NPMIDIINCAPSW,*LPMIDIINCAPSW; +typedef struct midihdr_tag { + LPSTR lpData; + DWORD dwBufferLength; + DWORD dwBytesRecorded; + DWORD dwUser; + DWORD dwFlags; + struct midihdr_tag *lpNext; + DWORD reserved; + DWORD dwOffset; + DWORD dwReserved[8]; +} MIDIHDR,*PMIDIHDR,*LPMIDIHDR; +typedef struct midievent_tag { + DWORD dwDeltaTime; + DWORD dwStreamID; + DWORD dwEvent; + DWORD dwParms[1]; +} MIDIEVENT; +typedef struct midistrmbuffver_tag { + DWORD dwVersion; + DWORD dwMid; + DWORD dwOEMVersion; +} MIDISTRMBUFFVER; +typedef struct midiproptimediv_tag { + DWORD cbStruct; + DWORD dwTimeDiv; +} MIDIPROPTIMEDIV,*LPMIDIPROPTIMEDIV; +typedef struct midiproptempo_tag { + DWORD cbStruct; + DWORD dwTempo; +} MIDIPROPTEMPO,*LPMIDIPROPTEMPO; +typedef struct tagAUXCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSA,*PAUXCAPSA,*LPAUXCAPSA; +typedef struct tagAUXCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + WORD wTechnology; + WORD wReserved1; + DWORD dwSupport; +} AUXCAPSW,*PAUXCAPSW,*LPAUXCAPSW; +DECLARE_HANDLE(HMIXEROBJ); +typedef HMIXEROBJ *LPHMIXEROBJ; +DECLARE_HANDLE(HMIXER); +typedef HMIXER *LPHMIXER; +typedef struct tagMIXERCAPSA { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSA,*PMIXERCAPSA,*LPMIXERCAPSA; +typedef struct tagMIXERCAPSW { + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + DWORD fdwSupport; + DWORD cDestinations; +} MIXERCAPSW,*PMIXERCAPSW,*LPMIXERCAPSW; +typedef struct tagMIXERLINEA { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + CHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEA,*PMIXERLINEA,*LPMIXERLINEA; +typedef struct tagMIXERLINEW { + DWORD cbStruct; + DWORD dwDestination; + DWORD dwSource; + DWORD dwLineID; + DWORD fdwLine; + DWORD dwUser; + DWORD dwComponentType; + DWORD cChannels; + DWORD cConnections; + DWORD cControls; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + struct { + DWORD dwType; + DWORD dwDeviceID; + WORD wMid; + WORD wPid; + MMVERSION vDriverVersion; + WCHAR szPname[MAXPNAMELEN]; + } Target; +} MIXERLINEW,*PMIXERLINEW,*LPMIXERLINEW; +typedef struct tagMIXERCONTROLA { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + CHAR szShortName[MIXER_SHORT_NAME_CHARS]; + CHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLA,*PMIXERCONTROLA,*LPMIXERCONTROLA; +typedef struct tagMIXERCONTROLW { + DWORD cbStruct; + DWORD dwControlID; + DWORD dwControlType; + DWORD fdwControl; + DWORD cMultipleItems; + WCHAR szShortName[MIXER_SHORT_NAME_CHARS]; + WCHAR szName[MIXER_LONG_NAME_CHARS]; + union { + _ANONYMOUS_STRUCT struct { + LONG lMinimum; + LONG lMaximum; + }_STRUCT_NAME(s); + _ANONYMOUS_STRUCT struct { + DWORD dwMinimum; + DWORD dwMaximum; + }_STRUCT_NAME(s1); + DWORD dwReserved[6]; + } Bounds; + union { + DWORD cSteps; + DWORD cbCustomData; + DWORD dwReserved[6]; + } Metrics; +} MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW; +typedef struct tagMIXERLINECONTROLSA { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLA pamxctrl; +} MIXERLINECONTROLSA,*PMIXERLINECONTROLSA,*LPMIXERLINECONTROLSA; +typedef struct tagMIXERLINECONTROLSW { + DWORD cbStruct; + DWORD dwLineID; + _ANONYMOUS_UNION union { + DWORD dwControlID; + DWORD dwControlType; + } DUMMYUNIONNAME; + DWORD cControls; + DWORD cbmxctrl; + LPMIXERCONTROLW pamxctrl; +} MIXERLINECONTROLSW,*PMIXERLINECONTROLSW,*LPMIXERLINECONTROLSW; +typedef struct tMIXERCONTROLDETAILS { + DWORD cbStruct; + DWORD dwControlID; + DWORD cChannels; + _ANONYMOUS_UNION union { + HWND hwndOwner; + DWORD cMultipleItems; + } DUMMYUNIONNAME; + DWORD cbDetails; + PVOID paDetails; +} MIXERCONTROLDETAILS,*PMIXERCONTROLDETAILS,*LPMIXERCONTROLDETAILS; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA { + DWORD dwParam1; + DWORD dwParam2; + CHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTA,*PMIXERCONTROLDETAILS_LISTTEXTA,*LPMIXERCONTROLDETAILS_LISTTEXTA; +typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW { + DWORD dwParam1; + DWORD dwParam2; + WCHAR szName[MIXER_LONG_NAME_CHARS]; +} MIXERCONTROLDETAILS_LISTTEXTW,*PMIXERCONTROLDETAILS_LISTTEXTW,*LPMIXERCONTROLDETAILS_LISTTEXTW; +typedef struct tMIXERCONTROLDETAILS_BOOLEAN { + LONG fValue; +} MIXERCONTROLDETAILS_BOOLEAN,*PMIXERCONTROLDETAILS_BOOLEAN,*LPMIXERCONTROLDETAILS_BOOLEAN; +typedef struct tMIXERCONTROLDETAILS_SIGNED { + LONG lValue; +} MIXERCONTROLDETAILS_SIGNED,*PMIXERCONTROLDETAILS_SIGNED,*LPMIXERCONTROLDETAILS_SIGNED; +typedef struct tMIXERCONTROLDETAILS_UNSIGNED { + DWORD dwValue; +} MIXERCONTROLDETAILS_UNSIGNED,*PMIXERCONTROLDETAILS_UNSIGNED,*LPMIXERCONTROLDETAILS_UNSIGNED; +typedef void(CALLBACK TIMECALLBACK)(UINT,UINT,DWORD,DWORD,DWORD); +typedef TIMECALLBACK *LPTIMECALLBACK; +typedef struct timecaps_tag { + UINT wPeriodMin; + UINT wPeriodMax; +} TIMECAPS,*PTIMECAPS,*LPTIMECAPS; +typedef struct tagJOYCAPSA { + WORD wMid; + WORD wPid; + CHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + CHAR szRegKey[MAXPNAMELEN]; + CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSA,*PJOYCAPSA,*LPJOYCAPSA; +typedef struct tagJOYCAPSW { + WORD wMid; + WORD wPid; + WCHAR szPname[MAXPNAMELEN]; + UINT wXmin; + UINT wXmax; + UINT wYmin; + UINT wYmax; + UINT wZmin; + UINT wZmax; + UINT wNumButtons; + UINT wPeriodMin; + UINT wPeriodMax; + UINT wRmin; + UINT wRmax; + UINT wUmin; + UINT wUmax; + UINT wVmin; + UINT wVmax; + UINT wCaps; + UINT wMaxAxes; + UINT wNumAxes; + UINT wMaxButtons; + WCHAR szRegKey[MAXPNAMELEN]; + WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; +} JOYCAPSW,*PJOYCAPSW,*LPJOYCAPSW; +typedef struct joyinfo_tag { + UINT wXpos; + UINT wYpos; + UINT wZpos; + UINT wButtons; +} JOYINFO,*PJOYINFO,*LPJOYINFO; +typedef struct joyinfoex_tag { + DWORD dwSize; + DWORD dwFlags; + DWORD dwXpos; + DWORD dwYpos; + DWORD dwZpos; + DWORD dwRpos; + DWORD dwUpos; + DWORD dwVpos; + DWORD dwButtons; + DWORD dwButtonNumber; + DWORD dwPOV; + DWORD dwReserved1; + DWORD dwReserved2; +} JOYINFOEX,*PJOYINFOEX,*LPJOYINFOEX; +typedef DWORD FOURCC; +typedef char *HPSTR; +DECLARE_HANDLE(HMMIO); +typedef LRESULT (CALLBACK MMIOPROC)(LPSTR,UINT,LPARAM,LPARAM); +typedef MMIOPROC *LPMMIOPROC; +typedef struct _MMIOINFO { + DWORD dwFlags; + FOURCC fccIOProc; + LPMMIOPROC pIOProc; + UINT wErrorRet; + HTASK htask; + LONG cchBuffer; + HPSTR pchBuffer; + HPSTR pchNext; + HPSTR pchEndRead; + HPSTR pchEndWrite; + LONG lBufOffset; + LONG lDiskOffset; + DWORD adwInfo[3]; + DWORD dwReserved1; + DWORD dwReserved2; + HMMIO hmmio; +} MMIOINFO,*PMMIOINFO,*LPMMIOINFO; +typedef const MMIOINFO *LPCMMIOINFO; +typedef struct _MMCKINFO { + FOURCC ckid; + DWORD cksize; + FOURCC fccType; + DWORD dwDataOffset; + DWORD dwFlags; +} MMCKINFO,*PMMCKINFO,*LPMMCKINFO; +typedef const MMCKINFO *LPCMMCKINFO; +typedef struct tagMCI_GENERIC_PARMS { + DWORD dwCallback; +} MCI_GENERIC_PARMS,*PMCI_GENERIC_PARMS,*LPMCI_GENERIC_PARMS; +typedef struct tagMCI_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; +} MCI_OPEN_PARMSA,*PMCI_OPEN_PARMSA,*LPMCI_OPEN_PARMSA; +typedef struct tagMCI_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; +} MCI_OPEN_PARMSW,*PMCI_OPEN_PARMSW,*LPMCI_OPEN_PARMSW; +typedef struct tagMCI_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_PLAY_PARMS,*PMCI_PLAY_PARMS,*LPMCI_PLAY_PARMS; +typedef struct tagMCI_SEEK_PARMS { + DWORD dwCallback; + DWORD dwTo; +} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS; +typedef struct tagMCI_STATUS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; + DWORD dwTrack; +} MCI_STATUS_PARMS,*PMCI_STATUS_PARMS,*LPMCI_STATUS_PARMS; +typedef struct tagMCI_INFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSA,*LPMCI_INFO_PARMSA; +typedef struct tagMCI_INFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; +} MCI_INFO_PARMSW,*LPMCI_INFO_PARMSW; +typedef struct tagMCI_GETDEVCAPS_PARMS { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; +} MCI_GETDEVCAPS_PARMS,*PMCI_GETDEVCAPS_PARMS,*LPMCI_GETDEVCAPS_PARMS; +typedef struct tagMCI_SYSINFO_PARMSA { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSA,*PMCI_SYSINFO_PARMSA,*LPMCI_SYSINFO_PARMSA; +typedef struct tagMCI_SYSINFO_PARMSW { + DWORD dwCallback; + LPWSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; +} MCI_SYSINFO_PARMSW,*PMCI_SYSINFO_PARMSW,*LPMCI_SYSINFO_PARMSW; +typedef struct tagMCI_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; +} MCI_SET_PARMS,*PMCI_SET_PARMS,*LPMCI_SET_PARMS; +typedef struct tagMCI_BREAK_PARMS { + DWORD dwCallback; + int nVirtKey; + HWND hwndBreak; +} MCI_BREAK_PARMS,*PMCI_BREAK_PARMS,*LPMCI_BREAK_PARMS; +typedef struct tagMCI_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_SAVE_PARMSA,*PMCI_SAVE_PARMSA,*LPMCI_SAVE_PARMSA; +typedef struct tagMCI_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_SAVE_PARMSW,*PMCI_SAVE_PARMSW,*LPMCI_SAVE_PARMSW; +typedef struct tagMCI_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; +} MCI_LOAD_PARMSA,*PMCI_LOAD_PARMSA,*LPMCI_LOAD_PARMSA; +typedef struct tagMCI_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; +} MCI_LOAD_PARMSW,*PMCI_LOAD_PARMSW,*LPMCI_LOAD_PARMSW; +typedef struct tagMCI_RECORD_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_RECORD_PARMS,*LPMCI_RECORD_PARMS; +typedef struct tagMCI_VD_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_VD_PLAY_PARMS,*PMCI_VD_PLAY_PARMS,*LPMCI_VD_PLAY_PARMS; +typedef struct tagMCI_VD_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_VD_STEP_PARMS,*PMCI_VD_STEP_PARMS,*LPMCI_VD_STEP_PARMS; +typedef struct tagMCI_VD_ESCAPE_PARMSA { + DWORD dwCallback; + LPCSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSA,*PMCI_VD_ESCAPE_PARMSA,*LPMCI_VD_ESCAPE_PARMSA; +typedef struct tagMCI_VD_ESCAPE_PARMSW { + DWORD dwCallback; + LPCWSTR lpstrCommand; +} MCI_VD_ESCAPE_PARMSW,*PMCI_VD_ESCAPE_PARMSW,*LPMCI_VD_ESCAPE_PARMSW; +typedef struct tagMCI_WAVE_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSA,*PMCI_WAVE_OPEN_PARMSA,*LPMCI_WAVE_OPEN_PARMSA; +typedef struct tagMCI_WAVE_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwBufferSeconds; +} MCI_WAVE_OPEN_PARMSW,*PMCI_WAVE_OPEN_PARMSW,*LPMCI_WAVE_OPEN_PARMSW; +typedef struct tagMCI_WAVE_DELETE_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; +} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,*LPMCI_WAVE_DELETE_PARMS; +typedef struct tagMCI_WAVE_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + UINT wInput; + UINT wOutput; + WORD wFormatTag; + WORD wReserved2; + WORD nChannels; + WORD wReserved3; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + WORD nBlockAlign; + WORD wReserved4; + WORD wBitsPerSample; + WORD wReserved5; +} MCI_WAVE_SET_PARMS,*PMCI_WAVE_SET_PARMS,*LPMCI_WAVE_SET_PARMS; + +LRESULT WINAPI CloseDriver(HDRVR,LONG,LONG); +HDRVR WINAPI OpenDriver(LPCWSTR,LPCWSTR,LONG); +LRESULT WINAPI SendDriverMessage(HDRVR,UINT,LONG,LONG); +HMODULE WINAPI DrvGetModuleHandle(HDRVR); +HMODULE WINAPI GetDriverModuleHandle(HDRVR); +LRESULT WINAPI DefDriverProc(DWORD,HDRVR,UINT,LPARAM,LPARAM); +UINT WINAPI mmsystemGetVersion(void); +#define OutputDebugStr OutputDebugString +BOOL WINAPI sndPlaySoundA(LPCSTR,UINT); +BOOL WINAPI sndPlaySoundW(LPCWSTR,UINT); +BOOL WINAPI PlaySoundA(LPCSTR,HMODULE,DWORD); +BOOL WINAPI PlaySoundW(LPCWSTR,HMODULE,DWORD); +UINT WINAPI waveOutGetNumDevs(void); +MMRESULT WINAPI waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT); +MMRESULT WINAPI waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT); +MMRESULT WINAPI waveOutGetVolume(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetVolume(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveOutOpen(LPHWAVEOUT,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveOutClose(HWAVEOUT); +MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutWrite(HWAVEOUT,LPWAVEHDR,UINT); +MMRESULT WINAPI waveOutPause(HWAVEOUT); +MMRESULT WINAPI waveOutRestart(HWAVEOUT); +MMRESULT WINAPI waveOutReset(HWAVEOUT); +MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT); +MMRESULT WINAPI waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT); +MMRESULT WINAPI waveOutGetPitch(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPitch(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT,PDWORD); +MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD); +MMRESULT WINAPI waveOutGetID(HWAVEOUT,LPUINT); +MMRESULT WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD); +UINT WINAPI waveInGetNumDevs(void); +MMRESULT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT); +MMRESULT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT); +MMRESULT WINAPI waveInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI waveInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD*,DWORD*,DWORD); +//MMRESULT WINAPI waveInOpen(LPHWAVEIN,UINT,LPCWAVEFORMATEX,DWORD,DWORD,DWORD); +MMRESULT WINAPI waveInClose(HWAVEIN); +MMRESULT WINAPI waveInPrepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInAddBuffer(HWAVEIN,LPWAVEHDR,UINT); +MMRESULT WINAPI waveInStart(HWAVEIN); +MMRESULT WINAPI waveInStop(HWAVEIN); +MMRESULT WINAPI waveInReset(HWAVEIN); +MMRESULT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT); +MMRESULT WINAPI waveInGetID(HWAVEIN,LPUINT); +MMRESULT WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD); +UINT WINAPI midiOutGetNumDevs(void); +MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM,LPUINT,DWORD,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiStreamClose(HMIDISTRM); +MMRESULT WINAPI midiStreamProperty(HMIDISTRM,LPBYTE,DWORD); +MMRESULT WINAPI midiStreamPosition(HMIDISTRM,LPMMTIME,UINT); +MMRESULT WINAPI midiStreamOut(HMIDISTRM,LPMIDIHDR,UINT); +MMRESULT WINAPI midiStreamPause(HMIDISTRM); +MMRESULT WINAPI midiStreamRestart(HMIDISTRM); +MMRESULT WINAPI midiStreamStop(HMIDISTRM); +MMRESULT WINAPI midiConnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiDisconnect(HMIDI,HMIDIOUT,PVOID); +MMRESULT WINAPI midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT); +MMRESULT WINAPI midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT); +MMRESULT WINAPI midiOutGetVolume(HMIDIOUT,PDWORD); +MMRESULT WINAPI midiOutSetVolume(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiOutOpen(LPHMIDIOUT,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiOutClose(HMIDIOUT); +MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutShortMsg(HMIDIOUT,DWORD); +MMRESULT WINAPI midiOutLongMsg(HMIDIOUT,LPMIDIHDR,UINT); +MMRESULT WINAPI midiOutReset(HMIDIOUT); +MMRESULT WINAPI midiOutCachePatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,LPWORD,UINT); +MMRESULT WINAPI midiOutGetID(HMIDIOUT,LPUINT); +MMRESULT WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD); +UINT WINAPI midiInGetNumDevs(void); +MMRESULT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT); +MMRESULT WINAPI midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT); +MMRESULT WINAPI midiInGetErrorTextA(MMRESULT,LPSTR,UINT); +MMRESULT WINAPI midiInGetErrorTextW(MMRESULT,LPWSTR,UINT); +MMRESULT WINAPI midiInOpen(LPHMIDIIN,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI midiInClose(HMIDIIN); +MMRESULT WINAPI midiInPrepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInAddBuffer(HMIDIIN,LPMIDIHDR,UINT); +MMRESULT WINAPI midiInStart(HMIDIIN); +MMRESULT WINAPI midiInStop(HMIDIIN); +MMRESULT WINAPI midiInReset(HMIDIIN); +MMRESULT WINAPI midiInGetID(HMIDIIN,LPUINT); +MMRESULT WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD); +UINT WINAPI auxGetNumDevs(void); +MMRESULT WINAPI auxGetDevCapsA(UINT,LPAUXCAPSA,UINT); +MMRESULT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT); +MMRESULT WINAPI auxSetVolume(UINT,DWORD); +MMRESULT WINAPI auxGetVolume(UINT,PDWORD); +MMRESULT WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD); +UINT WINAPI mixerGetNumDevs(void); +MMRESULT WINAPI mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT); +MMRESULT WINAPI mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT); +MMRESULT WINAPI mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD); +MMRESULT WINAPI mixerClose(HMIXER); +DWORD WINAPI mixerMessage(HMIXER,UINT,DWORD,DWORD); +MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD); +MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD); +MMRESULT WINAPI mixerGetID(HMIXEROBJ,PUINT,DWORD); +MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD); +MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD); +MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD); +MMRESULT WINAPI timeGetSystemTime(LPMMTIME,UINT); +DWORD WINAPI timeGetTime(void); +MMRESULT WINAPI timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT); +MMRESULT WINAPI timeKillEvent(UINT); +MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS,UINT); +MMRESULT WINAPI timeBeginPeriod(UINT); +MMRESULT WINAPI timeEndPeriod(UINT); +UINT WINAPI joyGetNumDevs(void); +MMRESULT WINAPI joyGetDevCapsA(UINT,LPJOYCAPSA,UINT); +MMRESULT WINAPI joyGetDevCapsW(UINT,LPJOYCAPSW,UINT); +MMRESULT WINAPI joyGetPos(UINT,LPJOYINFO); +MMRESULT WINAPI joyGetPosEx(UINT,LPJOYINFOEX); +MMRESULT WINAPI joyGetThreshold(UINT,LPUINT); +MMRESULT WINAPI joyReleaseCapture(UINT); +MMRESULT WINAPI joySetCapture(HWND,UINT,UINT,BOOL); +MMRESULT WINAPI joySetThreshold(UINT,UINT); +FOURCC WINAPI mmioStringToFOURCCA(LPCSTR,UINT); +FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR,UINT); +LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD); +LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD); +HMMIO WINAPI mmioOpenA(LPSTR,LPMMIOINFO,DWORD); +HMMIO WINAPI mmioOpenW(LPWSTR,LPMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameA(LPCSTR,LPCSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioRenameW(LPCWSTR,LPCWSTR,LPCMMIOINFO,DWORD); +MMRESULT WINAPI mmioClose(HMMIO,UINT); +LONG WINAPI mmioRead(HMMIO,HPSTR,LONG); +LONG WINAPI mmioWrite(HMMIO,LPCSTR,LONG); +LONG WINAPI mmioSeek(HMMIO,LONG,int); +MMRESULT WINAPI mmioGetInfo(HMMIO,LPMMIOINFO,UINT); +MMRESULT WINAPI mmioSetInfo(HMMIO,LPCMMIOINFO,UINT); +MMRESULT WINAPI mmioSetBuffer(HMMIO,LPSTR,LONG,UINT); +MMRESULT WINAPI mmioFlush(HMMIO,UINT); +MMRESULT WINAPI mmioAdvance(HMMIO,LPMMIOINFO,UINT); +LRESULT WINAPI mmioSendMessage(HMMIO,UINT,LPARAM,LPARAM); +MMRESULT WINAPI mmioDescend(HMMIO,LPMMCKINFO,const MMCKINFO*,UINT); +MMRESULT WINAPI mmioAscend(HMMIO,LPMMCKINFO,UINT); +MMRESULT WINAPI mmioCreateChunk(HMMIO,LPMMCKINFO,UINT); +MCIERROR WINAPI mciSendCommandA(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendCommandW(MCIDEVICEID,UINT,DWORD,DWORD); +MCIERROR WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND); +MCIERROR WINAPI mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND); +MCIDEVICEID WINAPI mciGetDeviceIDA(LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDW(LPCWSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA(DWORD,LPCSTR); +MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW(DWORD,LPCWSTR); +BOOL WINAPI mciGetErrorStringA(MCIERROR,LPSTR,UINT); +BOOL WINAPI mciGetErrorStringW(MCIERROR,LPWSTR,UINT); +BOOL WINAPI mciSetYieldProc(MCIDEVICEID,YIELDPROC,DWORD); +HTASK WINAPI mciGetCreatorTask(MCIDEVICEID); +YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID,PDWORD); + +typedef struct tagMCI_SEQ_SET_PARMS { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + DWORD dwTempo; + DWORD dwPort; + DWORD dwSlave; + DWORD dwMaster; + DWORD dwOffset; +} MCI_SEQ_SET_PARMS,*PMCI_SEQ_SET_PARMS,*LPMCI_SEQ_SET_PARMS; +typedef struct tagMCI_ANIM_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSA,*PMCI_ANIM_OPEN_PARMSA,*LPMCI_ANIM_OPEN_PARMSA; +typedef struct tagMCI_ANIM_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_ANIM_OPEN_PARMSW,*PMCI_ANIM_OPEN_PARMSW,*LPMCI_ANIM_OPEN_PARMSW; +typedef struct tagMCI_ANIM_PLAY_PARMS { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; +} MCI_ANIM_PLAY_PARMS,*PMCI_ANIM_PLAY_PARMS,*LPMCI_ANIM_PLAY_PARMS; +typedef struct tagMCI_ANIM_STEP_PARMS { + DWORD dwCallback; + DWORD dwFrames; +} MCI_ANIM_STEP_PARMS,*PMCI_ANIM_STEP_PARMS,*LPMCI_ANIM_STEP_PARMS; +typedef struct tagMCI_ANIM_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSA,*PMCI_ANIM_WINDOW_PARMSA,*LPMCI_ANIM_WINDOW_PARMSA; +typedef struct tagMCI_ANIM_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_ANIM_WINDOW_PARMSW,*PMCI_ANIM_WINDOW_PARMSW,*LPMCI_ANIM_WINDOW_PARMSW; +typedef struct tagMCI_ANIM_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_ANIM_RECT_PARMS,*PMCI_ANIM_RECT_PARMS,*LPMCI_ANIM_RECT_PARMS; +typedef struct tagMCI_ANIM_UPDATE_PARMS { + DWORD dwCallback; + RECT rc; + HDC hDC; +} MCI_ANIM_UPDATE_PARMS,*PMCI_ANIM_UPDATE_PARMS,*LPMCI_ANIM_UPDATE_PARMS; +typedef struct tagMCI_OVLY_OPEN_PARMSA { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSA,*PMCI_OVLY_OPEN_PARMSA,*LPMCI_OVLY_OPEN_PARMSA; +typedef struct tagMCI_OVLY_OPEN_PARMSW { + DWORD dwCallback; + MCIDEVICEID wDeviceID; + LPCWSTR lpstrDeviceType; + LPCWSTR lpstrElementName; + LPCWSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; +} MCI_OVLY_OPEN_PARMSW,*PMCI_OVLY_OPEN_PARMSW,*LPMCI_OVLY_OPEN_PARMSW; +typedef struct tagMCI_OVLY_WINDOW_PARMSA { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSA,*PMCI_OVLY_WINDOW_PARMSA,*LPMCI_OVLY_WINDOW_PARMSA; +typedef struct tagMCI_OVLY_WINDOW_PARMSW { + DWORD dwCallback; + HWND hWnd; + UINT nCmdShow; + LPCWSTR lpstrText; +} MCI_OVLY_WINDOW_PARMSW,*PMCI_OVLY_WINDOW_PARMSW,*LPMCI_OVLY_WINDOW_PARMSW; +typedef struct tagMCI_OVLY_RECT_PARMS { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else + RECT rc; +#endif +} MCI_OVLY_RECT_PARMS,*PMCI_OVLY_RECT_PARMS,*LPMCI_OVLY_RECT_PARMS; +typedef struct tagMCI_OVLY_SAVE_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSA,*PMCI_OVLY_SAVE_PARMSA,*LPMCI_OVLY_SAVE_PARMSA; +typedef struct tagMCI_OVLY_SAVE_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_SAVE_PARMSW,*PMCI_OVLY_SAVE_PARMSW,*LPMCI_OVLY_SAVE_PARMSW; +typedef struct tagMCI_OVLY_LOAD_PARMSA { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSA,*PMCI_OVLY_LOAD_PARMSA,*LPMCI_OVLY_LOAD_PARMSA; +typedef struct tagMCI_OVLY_LOAD_PARMSW { + DWORD dwCallback; + LPCWSTR lpfilename; + RECT rc; +} MCI_OVLY_LOAD_PARMSW,*PMCI_OVLY_LOAD_PARMSW,*LPMCI_OVLY_LOAD_PARMSW; + +#ifdef UNICODE +typedef WAVEOUTCAPSW WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSW WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSW MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSW MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSW AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSW MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEW MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLW MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSW MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSW JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSW MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundW +#define PlaySound PlaySoundW +#define waveOutGetDevCaps waveOutGetDevCapsW +#define waveOutGetErrorText waveOutGetErrorTextW +#define waveInGetDevCaps waveInGetDevCapsW +#define waveInGetErrorText waveInGetErrorTextW +#define midiOutGetDevCaps midiOutGetDevCapsW +#define midiOutGetErrorText midiOutGetErrorTextW +#define midiInGetDevCaps midiInGetDevCapsW +#define midiInGetErrorText midiInGetErrorTextW +#define auxGetDevCaps auxGetDevCapsW +#define mixerGetDevCaps mixerGetDevCapsW +#define mixerGetLineInfo mixerGetLineInfoW +#define mixerGetLineControls mixerGetLineControlsW +#define mixerGetControlDetails mixerGetControlDetailsW +#define joyGetDevCaps joyGetDevCapsW +#define mmioInstallIOProc mmioInstallIOProcW +#define mmioStringToFOURCC mmioStringToFOURCCW +#define mmioOpen mmioOpenW +#define mmioRename mmioRenameW +#define mciSendCommand mciSendCommandW +#define mciSendString mciSendStringW +#define mciGetDeviceID mciGetDeviceIDW +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDW +#define mciGetErrorString mciGetErrorStringW +#else +typedef WAVEOUTCAPSA WAVEOUTCAPS,*PWAVEOUTCAPS,*LPWAVEOUTCAPS; +typedef WAVEINCAPSA WAVEINCAPS,*PWAVEINCAPS,*LPWAVEINCAPS; +typedef MIDIOUTCAPSA MIDIOUTCAPS,*PMIDIOUTCAPS,*LPMIDIOUTCAPS; +typedef MIDIINCAPSA MIDIINCAPS,*PMIDIINCAPS,*LPMIDIINCAPS; +typedef AUXCAPSA AUXCAPS,*PAUXCAPS,*LPAUXCAPS; +typedef MIXERCAPSA MIXERCAPS,*PMIXERCAPS,*LPMIXERCAPS; +typedef MIXERLINEA MIXERLINE,*PMIXERLINE,*LPMIXERLINE; +typedef MIXERCONTROLA MIXERCONTROL,*PMIXERCONTROL,*LPMIXERCONTROL; +typedef MIXERLINECONTROLSA MIXERLINECONTROLS,*PMIXERLINECONTROLS,*LPMIXERLINECONTROLS; +typedef MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT,*PMIXERCONTROLDETAILS_LISTTEXT,*LPMIXERCONTROLDETAILS_LISTTEXT; +typedef JOYCAPSA JOYCAPS,*PJOYCAPS,*LPJOYCAPS; +typedef MCI_OPEN_PARMSA MCI_OPEN_PARMS,*PMCI_OPEN_PARMS,*LPMCI_OPEN_PARMS; +typedef MCI_INFO_PARMSA MCI_INFO_PARMS,*LPMCI_INFO_PARMS; +typedef MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS,*PMCI_SYSINFO_PARMS,*LPMCI_SYSINFO_PARMS; +typedef MCI_SAVE_PARMSA MCI_SAVE_PARMS,*PMCI_SAVE_PARMS,*LPMCI_SAVE_PARMS; +typedef MCI_LOAD_PARMSA MCI_LOAD_PARMS,*PMCI_LOAD_PARMS,*LPMCI_LOAD_PARMS; +typedef MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS,*PMCI_VD_ESCAPE_PARMS,*LPMCI_VD_ESCAPE_PARMS; +typedef MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS,*PMCI_WAVE_OPEN_PARMS,*LPMCI_WAVE_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS,*PMCI_ANIM_OPEN_PARMS,*LPMCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS,*PMCI_ANIM_WINDOW_PARMS,*LPMCI_ANIM_WINDOW_PARMS; +typedef MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS,*PMCI_OVLY_OPEN_PARMS,*LPMCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS,*PMCI_OVLY_WINDOW_PARMS,*LPMCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS,*PMCI_OVLY_SAVE_PARMS,*LPMCI_OVLY_SAVE_PARMS; +#define sndPlaySound sndPlaySoundA +#define PlaySound PlaySoundA +#define waveOutGetDevCaps waveOutGetDevCapsA +#define waveOutGetErrorText waveOutGetErrorTextA +#define waveInGetDevCaps waveInGetDevCapsA +#define waveInGetErrorText waveInGetErrorTextA +#define midiOutGetDevCaps midiOutGetDevCapsA +#define midiOutGetErrorText midiOutGetErrorTextA +#define midiInGetDevCaps midiInGetDevCapsA +#define midiInGetErrorText midiInGetErrorTextA +#define auxGetDevCaps auxGetDevCapsA +#define mixerGetDevCaps mixerGetDevCapsA +#define mixerGetLineInfo mixerGetLineInfoA +#define mixerGetLineControls mixerGetLineControlsA +#define mixerGetControlDetails mixerGetControlDetailsA +#define joyGetDevCaps joyGetDevCapsA +#define mmioInstallIOProc mmioInstallIOProcA +#define mmioStringToFOURCC mmioStringToFOURCCA +#define mmioOpen mmioOpenA +#define mmioRename mmioRenameA +#define mciSendCommand mciSendCommandA +#define mciSendString mciSendStringA +#define mciGetDeviceID mciGetDeviceIDA +#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDA +#define mciGetErrorString mciGetErrorStringA +#endif +#ifdef __cplusplus +} +#endif +#pragma pack(pop) +#endif diff --git a/colorchord2/windows/symbol_enumerator.c b/colorchord2/windows/symbol_enumerator.c new file mode 100644 index 0000000..fcb3727 --- /dev/null +++ b/colorchord2/windows/symbol_enumerator.c @@ -0,0 +1,245 @@ +#include +#include "symbol_enumerator.h" + +#if defined( WIN32 ) || defined( WINDOWS ) || defined( USE_WINDOWS ) || defined( _WIN32 ) + +#include + +typedef struct _SYMBOL_INFO { + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + TCHAR Name[1]; +} SYMBOL_INFO, *PSYMBOL_INFO; +typedef struct _IMAGEHLP_STACK_FRAME { + ULONG64 InstructionOffset; + ULONG64 ReturnOffset; + ULONG64 FrameOffset; + ULONG64 StackOffset; + ULONG64 BackingStoreOffset; + ULONG64 FuncTableEntry; + ULONG64 Params[4]; + ULONG64 Reserved[5]; + BOOL Virtual; + ULONG Reserved2; +} IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME; + + +typedef BOOL (*PSYM_ENUMERATESYMBOLS_CALLBACK)( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext + ); + +BOOL WINAPI SymEnumSymbols( + HANDLE hProcess, + ULONG64 BaseOfDll, + PCTSTR Mask, + PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, + const PVOID UserContext +); + +BOOL WINAPI SymInitialize( + HANDLE hProcess, + PCTSTR UserSearchPath, + BOOL fInvadeProcess +); + +BOOL WINAPI SymCleanup( + HANDLE hProcess +); + +BOOL CALLBACK __cdecl mycb( + PSYMBOL_INFO pSymInfo, + ULONG SymbolSize, + PVOID UserContext + ){ + SymEnumeratorCallback cb = (SymEnumeratorCallback)UserContext; + return !cb( "", &pSymInfo->Name[0], (void*)pSymInfo->Address, (long) pSymInfo->Size ); + } + +int EnumerateSymbols( SymEnumeratorCallback cb ) +{ + HANDLE proc = GetCurrentProcess(); + if( !SymInitialize( proc, 0, 1 ) ) return -1; + if( !SymEnumSymbols( proc, 0, "*!*", &mycb, (void*)cb ) ) + { + SymCleanup(proc); + return -2; + } + SymCleanup(proc); + return 0; +} + +#else + + +#include +#include +#include +#include +#include + +#ifndef __GNUC__ +#define __int128_t long long long +#endif + +#include +#include + +#define UINTS_PER_WORD (__WORDSIZE / (CHAR_BIT * sizeof (unsigned int))) + + + struct dl_phdr_info { + ElfW(Addr) dlpi_addr; /* Base address of object */ + const char *dlpi_name; /* (Null-terminated) name of + object */ + const ElfW(Phdr) *dlpi_phdr; /* Pointer to array of + ELF program headers + for this object */ + ElfW(Half) dlpi_phnum; /* # of items in dlpi_phdr */ + }; + + + +void dl_iterate_phdr( void*, void*); + + +static ElfW(Word) gnu_hashtab_symbol_count(const unsigned int *const table) +{ + const unsigned int *const bucket = table + 4 + table[2] * (unsigned int)(UINTS_PER_WORD); + unsigned int b = table[0]; + unsigned int max = 0U; + + while (b-->0U) + if (bucket[b] > max) + max = bucket[b]; + + return (ElfW(Word))max; +} + +static static void *dynamic_pointer(const ElfW(Addr) addr, + const ElfW(Addr) base, const ElfW(Phdr) *const header, const ElfW(Half) headers) +{ + if (addr) { + ElfW(Half) h; + + for (h = 0; h < headers; h++) + if (header[h].p_type == PT_LOAD) + if (addr >= base + header[h].p_vaddr && + addr < base + header[h].p_vaddr + header[h].p_memsz) + return (void *)addr; + } + + return NULL; +} + +//Mostly based off of http://stackoverflow.com/questions/29903049/get-names-and-addresses-of-exported-functions-from-in-linux +static int callback(struct dl_phdr_info *info, + size_t size, void *data) +{ + SymEnumeratorCallback cb = (SymEnumeratorCallback)data; + const ElfW(Addr) base = info->dlpi_addr; + const ElfW(Phdr) *const header = info->dlpi_phdr; + const ElfW(Half) headers = info->dlpi_phnum; + const char *libpath, *libname; + ElfW(Half) h; + + if (info->dlpi_name && info->dlpi_name[0]) + libpath = info->dlpi_name; + else + libpath = ""; + + libname = strrchr(libpath, '/'); + + if (libname && libname[0] == '/' && libname[1]) + libname++; + else + libname = libpath; + + for (h = 0; h < headers; h++) + { + if (header[h].p_type == PT_DYNAMIC) + { + const ElfW(Dyn) *entry = (const ElfW(Dyn) *)(base + header[h].p_vaddr); + const ElfW(Word) *hashtab; + const ElfW(Sym) *symtab = NULL; + const char *strtab = NULL; + ElfW(Word) symbol_count = 0; + + for (; entry->d_tag != DT_NULL; entry++) + { + switch (entry->d_tag) + { + case DT_HASH: + hashtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + if (hashtab) + symbol_count = hashtab[1]; + break; + case DT_GNU_HASH: + hashtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + if (hashtab) + { + ElfW(Word) count = gnu_hashtab_symbol_count(hashtab); + if (count > symbol_count) + symbol_count = count; + } + break; + case DT_STRTAB: + strtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + break; + case DT_SYMTAB: + symtab = dynamic_pointer(entry->d_un.d_ptr, base, header, headers); + break; + } + } + + if (symtab && strtab && symbol_count > 0) { + ElfW(Word) s; + + for (s = 0; s < symbol_count; s++) { + const char *name; + void *const ptr = dynamic_pointer(base + symtab[s].st_value, base, header, headers); + int result; + + if (!ptr) + continue; + + if (symtab[s].st_name) + name = strtab + symtab[s].st_name; + else + name = ""; + + result = cb( libpath, name, ptr, symtab[s].st_size ); + if( result ) return result; //Bail early. + } + } + } + } + return 0; +} + + + + + +int EnumerateSymbols( SymEnumeratorCallback cb ) +{ + dl_iterate_phdr( callback, cb ); +} + + + + +#endif diff --git a/colorchord2/windows/symbol_enumerator.h b/colorchord2/windows/symbol_enumerator.h new file mode 100644 index 0000000..87e033b --- /dev/null +++ b/colorchord2/windows/symbol_enumerator.h @@ -0,0 +1,12 @@ +#ifndef _SYMBOL_ENUMERATOR_H +#define _SYMBOL_ENUMERATOR_H + +//Enumerates all symbols in the currently loaded excutable. +//Don't forget to compile with -rdynamic! + +//Return 0 to continue search. 1 to stop. +typedef int (*SymEnumeratorCallback)( const char * path, const char * name, void * location, long size ); + +int EnumerateSymbols( SymEnumeratorCallback cb ); + +#endif diff --git a/colorchord2/windows/tcc_stubs.c b/colorchord2/windows/tcc_stubs.c new file mode 100644 index 0000000..c6dfc76 --- /dev/null +++ b/colorchord2/windows/tcc_stubs.c @@ -0,0 +1,80 @@ + +#include <_mingw.h> + +#define REMATH(x) double __cdecl x( double f ); float x##f(float v) { return x(v); } + +int SymnumCheck( const char * path, const char * name, void * location, long size ) +{ + if( strncmp( name, "REGISTER", 8 ) == 0 ) + { + typedef void (*sf)(); + sf fn = (sf)location; + fn(); + } + return 0; +} + + + +void ManuallyRegisterDevices() +{ + EnumerateSymbols( SymnumCheck ); +} + +REMATH( acos ); +REMATH( cos ); +REMATH( sin ); +REMATH( sqrt ); +REMATH( asin ); +REMATH( exp ); +REMATH( fmod ); +REMATH( pow ); + +double __cdecl strtod (const char* str, char** endptr); +float strtof( const char* str, char** endptr) +{ + return strtod( str, endptr ); +} + +double __cdecl atan2(double a, double b); +float atan2f(float a, float b) +{ + return atan2( a, b ); +} + +//From http://stackoverflow.com/questions/40159892/using-asprintf-on-windows +int __cdecl vsprintf_s( + char *buffer, + size_t numberOfElements, + const char *format, + va_list argptr +); + +int asprintf(char **strp, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int r = vasprintf(strp, fmt, ap); + va_end(ap); + return r; +} + +int vasprintf(char **strp, const char *fmt, va_list ap) { + // _vscprintf tells you how big the buffer needs to be + int len = _vscprintf(fmt, ap); + if (len == -1) { + return -1; + } + size_t size = (size_t)len + 1; + char *str = (char*)malloc(size); + if (!str) { + return -1; + } + // _vsprintf_s is the "secure" version of vsprintf + int r = vsprintf_s(str, len + 1, fmt, ap); + if (r == -1) { + free(str); + return -1; + } + *strp = str; + return r; +} \ No newline at end of file diff --git a/colorchord2/windows/winsock2.h b/colorchord2/windows/winsock2.h new file mode 100644 index 0000000..d318eb6 --- /dev/null +++ b/colorchord2/windows/winsock2.h @@ -0,0 +1,1303 @@ +/* + + Definitions for winsock 2 + + Contributed by the WINE project. + + Portions Copyright (c) 1980, 1983, 1988, 1993 + The Regents of the University of California. All rights reserved. + + Portions Copyright (c) 1993 by Digital Equipment Corporation. + */ + +#if !(defined _WINSOCK2_H || defined _WINSOCK_H) +#define _WINSOCK2_H +#define _WINSOCK_H /* to prevent later inclusion of winsock.h */ +#if __GNUC__ >= 3 +#pragma GCC system_header +#endif + +#define _GNU_H_WINDOWS32_SOCKETS + +#include + +#ifndef WINSOCK_API_LINKAGE +#ifdef __W32API_USE_DLLIMPORT__ +#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT +#else +#define WINSOCK_API_LINKAGE +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif +/* Names common to Winsock1.1 and Winsock2 */ +#if !defined ( _BSDTYPES_DEFINED ) +/* also defined in gmon.h and in cygwin's sys/types */ +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +#define _BSDTYPES_DEFINED +#endif /* ! def _BSDTYPES_DEFINED */ +typedef u_int SOCKET; +#ifndef FD_SETSIZE +#define FD_SETSIZE 64 +#endif + +/* shutdown() how types */ +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 + +#ifndef _SYS_TYPES_FD_SET +/* fd_set may be defined by the newlib + * if __USE_W32_SOCKETS not defined. + */ +#ifdef fd_set +#undef fd_set +#endif +typedef struct fd_set { + u_int fd_count; + SOCKET fd_array[FD_SETSIZE]; +} fd_set; +int PASCAL __WSAFDIsSet(SOCKET,fd_set*); +#ifndef FD_CLR +#define FD_CLR(fd,set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + while (__i < ((fd_set *)(set))->fd_count-1) {\ + ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\ + __i++;\ + }\ + ((fd_set*)(set))->fd_count--;\ + break;\ + }\ +}\ +} while (0) +#endif +#ifndef FD_SET +/* this differs from the define in winsock.h and in cygwin sys/types.h */ +#define FD_SET(fd, set) do { u_int __i;\ +for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\ + if (((fd_set *)(set))->fd_array[__i] == (fd)) {\ + break;\ + }\ +}\ +if (__i == ((fd_set *)(set))->fd_count) {\ + if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\ + ((fd_set *)(set))->fd_array[__i] = (fd);\ + ((fd_set *)(set))->fd_count++;\ + }\ +}\ +} while(0) +#endif +#ifndef FD_ZERO +#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0) +#endif +#ifndef FD_ISSET +#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set)) +#endif +#elif !defined (USE_SYS_TYPES_FD_SET) +#warning "fd_set and associated macros have been defined in sys/types. \ + This may cause runtime problems with W32 sockets" +#endif /* ndef _SYS_TYPES_FD_SET */ +#if !(defined (__INSIDE_CYGWIN__) || (__INSIDE_MSYS__)) +#ifndef _TIMEVAL_DEFINED /* also in sys/time.h */ +#define _TIMEVAL_DEFINED +struct timeval { + long tv_sec; + long tv_usec; +}; +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec != (uvp)->tv_sec) ? \ + ((tvp)->tv_sec cmp (uvp)->tv_sec) : \ + ((tvp)->tv_usec cmp (uvp)->tv_usec)) +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 +#endif /* _TIMEVAL_DEFINED */ +struct hostent { + char *h_name; + char **h_aliases; + short h_addrtype; + short h_length; + char **h_addr_list; +#define h_addr h_addr_list[0] +}; +struct linger { + u_short l_onoff; + u_short l_linger; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define IOCPARM_MASK 0x7f +#define IOC_VOID 0x20000000 +#define IOC_OUT 0x40000000 +#define IOC_IN 0x80000000 +#define IOC_INOUT (IOC_IN|IOC_OUT) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define FIONBIO _IOW('f', 126, u_long) +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define FIONREAD _IOR('f', 127, u_long) +#define FIOASYNC _IOW('f', 125, u_long) +#define SIOCSHIWAT _IOW('s', 0, u_long) +#define SIOCGHIWAT _IOR('s', 1, u_long) +#define SIOCSLOWAT _IOW('s', 2, u_long) +#define SIOCGLOWAT _IOR('s', 3, u_long) +#define SIOCATMARK _IOR('s', 7, u_long) + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +struct netent { + char * n_name; + char **n_aliases; + short n_addrtype; + u_long n_net; +}; +struct servent { + char *s_name; + char **s_aliases; + short s_port; + char *s_proto; +}; +struct protoent { + char *p_name; + char **p_aliases; + short p_proto; +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_IGMP 2 +#define IPPROTO_GGP 3 +#define IPPROTO_TCP 6 +#define IPPROTO_PUP 12 +#define IPPROTO_UDP 17 +#define IPPROTO_IDP 22 +#define IPPROTO_ND 77 +#define IPPROTO_RAW 255 +#define IPPROTO_MAX 256 +/* IPv6 options */ +#define IPPROTO_HOPOPTS 0 /* IPv6 Hop-by-Hop options */ +#define IPPROTO_IPV6 41 /* IPv6 header */ +#define IPPROTO_ROUTING 43 /* IPv6 Routing header */ +#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */ +#define IPPROTO_ESP 50 /* encapsulating security payload */ +#define IPPROTO_AH 51 /* authentication header */ +#define IPPROTO_ICMPV6 58 /* ICMPv6 */ +#define IPPROTO_NONE 59 /* IPv6 no next header */ +#define IPPROTO_DSTOPTS 60 /* IPv6 Destination options */ +#define IPPORT_ECHO 7 +#define IPPORT_DISCARD 9 +#define IPPORT_SYSTAT 11 +#define IPPORT_DAYTIME 13 +#define IPPORT_NETSTAT 15 +#define IPPORT_FTP 21 +#define IPPORT_TELNET 23 +#define IPPORT_SMTP 25 +#define IPPORT_TIMESERVER 37 +#define IPPORT_NAMESERVER 42 +#define IPPORT_WHOIS 43 +#define IPPORT_MTP 57 +#define IPPORT_TFTP 69 +#define IPPORT_RJE 77 +#define IPPORT_FINGER 79 +#define IPPORT_TTYLINK 87 +#define IPPORT_SUPDUP 95 +#define IPPORT_EXECSERVER 512 +#define IPPORT_LOGINSERVER 513 +#define IPPORT_CMDSERVER 514 +#define IPPORT_EFSSERVER 520 +#define IPPORT_BIFFUDP 512 +#define IPPORT_WHOSERVER 513 +#define IPPORT_ROUTESERVER 520 +#define IPPORT_RESERVED 1024 +#define IMPLINK_IP 155 +#define IMPLINK_LOWEXPER 156 +#define IMPLINK_HIGHEXPER 158 +struct in_addr { + union { + struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; + struct { u_short s_w1,s_w2; } S_un_w; + u_long S_addr; + } S_un; +#define s_addr S_un.S_addr +#define s_host S_un.S_un_b.s_b2 +#define s_net S_un.S_un_b.s_b1 +#define s_imp S_un.S_un_w.s_w2 +#define s_impno S_un.S_un_b.s_b4 +#define s_lh S_un.S_un_b.s_b3 +}; +#define IN_CLASSA(i) (((long)(i)&0x80000000) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST 0x00ffffff +#define IN_CLASSA_MAX 128 +#define IN_CLASSB(i) (((long)(i)&0xc0000000)==0x80000000) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST 0x0000ffff +#define IN_CLASSB_MAX 65536 +#define IN_CLASSC(i) (((long)(i)&0xe0000000)==0xc0000000) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST 0xff +#define INADDR_ANY (u_long)0 +#define INADDR_LOOPBACK 0x7f000001 +#define INADDR_BROADCAST (u_long)0xffffffff +#define INADDR_NONE 0xffffffff +struct sockaddr_in { + short sin_family; + u_short sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; +#define WSADESCRIPTION_LEN 256 +#define WSASYS_STATUS_LEN 128 +typedef struct WSAData { + WORD wVersion; + WORD wHighVersion; + char szDescription[WSADESCRIPTION_LEN+1]; + char szSystemStatus[WSASYS_STATUS_LEN+1]; + unsigned short iMaxSockets; + unsigned short iMaxUdpDg; + char * lpVendorInfo; +} WSADATA; +typedef WSADATA *LPWSADATA; + +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define IP_OPTIONS 1 +#define SO_DEBUG 1 +#define SO_ACCEPTCONN 2 +#define SO_REUSEADDR 4 +#define SO_KEEPALIVE 8 +#define SO_DONTROUTE 16 +#define SO_BROADCAST 32 +#define SO_USELOOPBACK 64 +#define SO_LINGER 128 +#define SO_OOBINLINE 256 +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_EXCLUSIVEADDRUSE ((u_int)(~SO_REUSEADDR)) +#define SO_SNDBUF 0x1001 +#define SO_RCVBUF 0x1002 +#define SO_SNDLOWAT 0x1003 +#define SO_RCVLOWAT 0x1004 +#define SO_SNDTIMEO 0x1005 +#define SO_RCVTIMEO 0x1006 +#define SO_ERROR 0x1007 +#define SO_TYPE 0x1008 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +#define INVALID_SOCKET (SOCKET)(~0) +#define SOCKET_ERROR (-1) +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 +#define SOCK_RDM 4 +#define SOCK_SEQPACKET 5 +#define TCP_NODELAY 0x0001 +#define AF_UNSPEC 0 +#define AF_UNIX 1 +#define AF_INET 2 +#define AF_IMPLINK 3 +#define AF_PUP 4 +#define AF_CHAOS 5 +#define AF_IPX 6 +#define AF_NS 6 +#define AF_ISO 7 +#define AF_OSI AF_ISO +#define AF_ECMA 8 +#define AF_DATAKIT 9 +#define AF_CCITT 10 +#define AF_SNA 11 +#define AF_DECnet 12 +#define AF_DLI 13 +#define AF_LAT 14 +#define AF_HYLINK 15 +#define AF_APPLETALK 16 +#define AF_NETBIOS 17 +#define AF_VOICEVIEW 18 +#define AF_FIREFOX 19 +#define AF_UNKNOWN1 20 +#define AF_BAN 21 +#define AF_ATM 22 +#define AF_INET6 23 +#define AF_CLUSTER 24 +#define AF_12844 25 +#define AF_IRDA 26 +#define AF_NETDES 28 +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define AF_MAX 29 +struct sockaddr { + u_short sa_family; + char sa_data[14]; +}; + +/* Portable IPv6/IPv4 version of sockaddr. Based on RFC 2553. + Pad to force 8 byte alignment and maximum size of 128 bytes. */ + +/* + * Desired design of maximum size and alignment + */ +#define _SS_MAXSIZE 128 +#define _SS_ALIGNSIZE (sizeof (__int64)) +/* + * Definitions used for sockaddr_storage structure paddings design. + */ +#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short)) +#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) \ + + _SS_PAD1SIZE \ + + _SS_ALIGNSIZE)) +struct sockaddr_storage { + short ss_family; + char __ss_pad1[_SS_PAD1SIZE]; /* pad to 8 */ + __int64 __ss_align; /* force alignment */ + char __ss_pad2[_SS_PAD2SIZE]; /* pad to 128 */ +}; +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +struct sockproto { + u_short sp_family; + u_short sp_protocol; +}; +#define PF_UNSPEC AF_UNSPEC +#define PF_UNIX AF_UNIX +#define PF_INET AF_INET +#define PF_IMPLINK AF_IMPLINK +#define PF_PUP AF_PUP +#define PF_CHAOS AF_CHAOS +#define PF_NS AF_NS +#define PF_IPX AF_IPX +#define PF_ISO AF_ISO +#define PF_OSI AF_OSI +#define PF_ECMA AF_ECMA +#define PF_DATAKIT AF_DATAKIT +#define PF_CCITT AF_CCITT +#define PF_SNA AF_SNA +#define PF_DECnet AF_DECnet +#define PF_DLI AF_DLI +#define PF_LAT AF_LAT +#define PF_HYLINK AF_HYLINK +#define PF_APPLETALK AF_APPLETALK +#define PF_VOICEVIEW AF_VOICEVIEW +#define PF_FIREFOX AF_FIREFOX +#define PF_UNKNOWN1 AF_UNKNOWN1 +#define PF_BAN AF_BAN +#define PF_ATM AF_ATM +#define PF_INET6 AF_INET6 +#define PF_MAX AF_MAX +#define SOL_SOCKET 0xffff +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define SOMAXCONN 0x7fffffff /* (5) in WinSock1.1 */ +#define MSG_OOB 1 +#define MSG_PEEK 2 +#define MSG_DONTROUTE 4 +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +#define MSG_MAXIOVLEN 16 +#define MSG_PARTIAL 0x8000 +#define MAXGETHOSTSTRUCT 1024 + +#define FD_READ_BIT 0 +#define FD_READ (1 << FD_READ_BIT) +#define FD_WRITE_BIT 1 +#define FD_WRITE (1 << FD_WRITE_BIT) +#define FD_OOB_BIT 2 +#define FD_OOB (1 << FD_OOB_BIT) +#define FD_ACCEPT_BIT 3 +#define FD_ACCEPT (1 << FD_ACCEPT_BIT) +#define FD_CONNECT_BIT 4 +#define FD_CONNECT (1 << FD_CONNECT_BIT) +#define FD_CLOSE_BIT 5 +#define FD_CLOSE (1 << FD_CLOSE_BIT) +/* winsock1.1 defines stop at FD_CLOSE (32) */ +#define FD_QOS_BIT 6 +#define FD_QOS (1 << FD_QOS_BIT) +#define FD_GROUP_QOS_BIT 7 +#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT) +#define FD_ROUTING_INTERFACE_CHANGE_BIT 8 +#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT) +#define FD_ADDRESS_LIST_CHANGE_BIT 9 +#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT) +#define FD_MAX_EVENTS 10 +#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1) + +#ifndef WSABASEERR +#define WSABASEERR 10000 +#define WSAEINTR (WSABASEERR+4) +#define WSAEBADF (WSABASEERR+9) +#define WSAEACCES (WSABASEERR+13) +#define WSAEFAULT (WSABASEERR+14) +#define WSAEINVAL (WSABASEERR+22) +#define WSAEMFILE (WSABASEERR+24) +#define WSAEWOULDBLOCK (WSABASEERR+35) +#define WSAEINPROGRESS (WSABASEERR+36) /* deprecated on WinSock2 */ +#define WSAEALREADY (WSABASEERR+37) +#define WSAENOTSOCK (WSABASEERR+38) +#define WSAEDESTADDRREQ (WSABASEERR+39) +#define WSAEMSGSIZE (WSABASEERR+40) +#define WSAEPROTOTYPE (WSABASEERR+41) +#define WSAENOPROTOOPT (WSABASEERR+42) +#define WSAEPROTONOSUPPORT (WSABASEERR+43) +#define WSAESOCKTNOSUPPORT (WSABASEERR+44) +#define WSAEOPNOTSUPP (WSABASEERR+45) +#define WSAEPFNOSUPPORT (WSABASEERR+46) +#define WSAEAFNOSUPPORT (WSABASEERR+47) +#define WSAEADDRINUSE (WSABASEERR+48) +#define WSAEADDRNOTAVAIL (WSABASEERR+49) +#define WSAENETDOWN (WSABASEERR+50) +#define WSAENETUNREACH (WSABASEERR+51) +#define WSAENETRESET (WSABASEERR+52) +#define WSAECONNABORTED (WSABASEERR+53) +#define WSAECONNRESET (WSABASEERR+54) +#define WSAENOBUFS (WSABASEERR+55) +#define WSAEISCONN (WSABASEERR+56) +#define WSAENOTCONN (WSABASEERR+57) +#define WSAESHUTDOWN (WSABASEERR+58) +#define WSAETOOMANYREFS (WSABASEERR+59) +#define WSAETIMEDOUT (WSABASEERR+60) +#define WSAECONNREFUSED (WSABASEERR+61) +#define WSAELOOP (WSABASEERR+62) +#define WSAENAMETOOLONG (WSABASEERR+63) +#define WSAEHOSTDOWN (WSABASEERR+64) +#define WSAEHOSTUNREACH (WSABASEERR+65) +#define WSAENOTEMPTY (WSABASEERR+66) +#define WSAEPROCLIM (WSABASEERR+67) +#define WSAEUSERS (WSABASEERR+68) +#define WSAEDQUOT (WSABASEERR+69) +#define WSAESTALE (WSABASEERR+70) +#define WSAEREMOTE (WSABASEERR+71) +#define WSAEDISCON (WSABASEERR+101) +#define WSASYSNOTREADY (WSABASEERR+91) +#define WSAVERNOTSUPPORTED (WSABASEERR+92) +#define WSANOTINITIALISED (WSABASEERR+93) +#define WSAHOST_NOT_FOUND (WSABASEERR+1001) +#define WSATRY_AGAIN (WSABASEERR+1002) +#define WSANO_RECOVERY (WSABASEERR+1003) +#define WSANO_DATA (WSABASEERR+1004) + +/* WinSock2 specific error codes */ +#define WSAENOMORE (WSABASEERR+102) +#define WSAECANCELLED (WSABASEERR+103) +#define WSAEINVALIDPROCTABLE (WSABASEERR+104) +#define WSAEINVALIDPROVIDER (WSABASEERR+105) +#define WSAEPROVIDERFAILEDINIT (WSABASEERR+106) +#define WSASYSCALLFAILURE (WSABASEERR+107) +#define WSASERVICE_NOT_FOUND (WSABASEERR+108) +#define WSATYPE_NOT_FOUND (WSABASEERR+109) +#define WSA_E_NO_MORE (WSABASEERR+110) +#define WSA_E_CANCELLED (WSABASEERR+111) +#define WSAEREFUSED (WSABASEERR+112) + +/* WS QualityofService errors */ +#define WSA_QOS_RECEIVERS (WSABASEERR + 1005) +#define WSA_QOS_SENDERS (WSABASEERR + 1006) +#define WSA_QOS_NO_SENDERS (WSABASEERR + 1007) +#define WSA_QOS_NO_RECEIVERS (WSABASEERR + 1008) +#define WSA_QOS_REQUEST_CONFIRMED (WSABASEERR + 1009) +#define WSA_QOS_ADMISSION_FAILURE (WSABASEERR + 1010) +#define WSA_QOS_POLICY_FAILURE (WSABASEERR + 1011) +#define WSA_QOS_BAD_STYLE (WSABASEERR + 1012) +#define WSA_QOS_BAD_OBJECT (WSABASEERR + 1013) +#define WSA_QOS_TRAFFIC_CTRL_ERROR (WSABASEERR + 1014) +#define WSA_QOS_GENERIC_ERROR (WSABASEERR + 1015) +#define WSA_QOS_ESERVICETYPE (WSABASEERR + 1016) +#define WSA_QOS_EFLOWSPEC (WSABASEERR + 1017) +#define WSA_QOS_EPROVSPECBUF (WSABASEERR + 1018) +#define WSA_QOS_EFILTERSTYLE (WSABASEERR + 1019) +#define WSA_QOS_EFILTERTYPE (WSABASEERR + 1020) +#define WSA_QOS_EFILTERCOUNT (WSABASEERR + 1021) +#define WSA_QOS_EOBJLENGTH (WSABASEERR + 1022) +#define WSA_QOS_EFLOWCOUNT (WSABASEERR + 1023) +#define WSA_QOS_EUNKOWNPSOBJ (WSABASEERR + 1024) +#define WSA_QOS_EPOLICYOBJ (WSABASEERR + 1025) +#define WSA_QOS_EFLOWDESC (WSABASEERR + 1026) +#define WSA_QOS_EPSFLOWSPEC (WSABASEERR + 1027) +#define WSA_QOS_EPSFILTERSPEC (WSABASEERR + 1028) +#define WSA_QOS_ESDMODEOBJ (WSABASEERR + 1029) +#define WSA_QOS_ESHAPERATEOBJ (WSABASEERR + 1030) +#define WSA_QOS_RESERVED_PETYPE (WSABASEERR + 1031) + +#endif /* !WSABASEERR */ + +#define WSANO_ADDRESS WSANO_DATA +#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +#define h_errno WSAGetLastError() +#define HOST_NOT_FOUND WSAHOST_NOT_FOUND +#define TRY_AGAIN WSATRY_AGAIN +#define NO_RECOVERY WSANO_RECOVERY +#define NO_DATA WSANO_DATA +#define NO_ADDRESS WSANO_ADDRESS +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ +WINSOCK_API_LINKAGE SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL bind(SOCKET,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL closesocket(SOCKET); +WINSOCK_API_LINKAGE int PASCAL connect(SOCKET,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL ioctlsocket(SOCKET,long,u_long *); +WINSOCK_API_LINKAGE int PASCAL getpeername(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL getsockname(SOCKET,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL getsockopt(SOCKET,int,int,char*,int*); +WINSOCK_API_LINKAGE unsigned long PASCAL inet_addr(const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr); +WINSOCK_API_LINKAGE int PASCAL listen(SOCKET,int); +WINSOCK_API_LINKAGE int PASCAL recv(SOCKET,char*,int,int); +WINSOCK_API_LINKAGE int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*); +WINSOCK_API_LINKAGE int PASCAL send(SOCKET,const char*,int,int); +WINSOCK_API_LINKAGE int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int); +WINSOCK_API_LINKAGE int PASCAL setsockopt(SOCKET,int,int,const char*,int); +WINSOCK_API_LINKAGE int PASCAL shutdown(SOCKET,int); +WINSOCK_API_LINKAGE SOCKET PASCAL socket(int,int,int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int); +WINSOCK_API_LINKAGE DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*); +typedef SOCKET (PASCAL * LPFN_ACCEPT)(SOCKET, struct sockaddr*,int *); +typedef int (PASCAL * LPFN_BIND)(SOCKET, const struct sockaddr*,int); +typedef int (PASCAL * LPFN_CLOSESOCKET)(SOCKET); +typedef int (PASCAL * LPFN_CONNECT)(SOCKET, const struct sockaddr*,int); +typedef int (PASCAL * LPFN_IOCTLSOCKET)(SOCKET, long, u_long*); +typedef int (PASCAL * LPFN_GETPEERNAME)(SOCKET, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_GETSOCKNAME)(SOCKET, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_GETSOCKOPT)(SOCKET, int, int, char*, int*); +typedef u_long(PASCAL * LPFN_HTONL)(u_long); +typedef u_short(PASCAL * LPFN_HTONS)(u_short); +typedef unsigned long(PASCAL * LPFN_INET_ADDR)(const char*); +typedef char*(PASCAL * LPFN_INET_NTOA)(struct in_addr); +typedef int(PASCAL * LPFN_LISTEN)(SOCKET, int); +typedef u_long(PASCAL * LPFN_NTOHL)(u_long); +typedef u_short(PASCAL * LPFN_NTOHS)(u_short); +typedef int(PASCAL * LPFN_RECV)(SOCKET, char*, int, int); +typedef int(PASCAL * LPFN_RECVFROM)(SOCKET, char*, int, int, struct sockaddr*, int*); +typedef int(PASCAL * LPFN_SELECT)(int, fd_set*, fd_set*, fd_set*, const struct timeval*); +typedef int(PASCAL * LPFN_SEND)(SOCKET, const char*, int, int); +typedef int(PASCAL * LPFN_SENDTO)(SOCKET, const char*, int, int, const struct sockaddr*, int); +typedef int(PASCAL * LPFN_SETSOCKOPT)(SOCKET, int, int, const char*, int); +typedef int(PASCAL * LPFN_SHUTDOWN)(SOCKET, int); +typedef SOCKET(PASCAL * LPFN_SOCKET)(int, int, int); +typedef struct hostent*(PASCAL * LPFN_GETHOSTBYADDR)( const char*, int, int); +typedef struct hostent*(PASCAL * LPFN_GETHOSTBYNAME)( const char*); +typedef int(PASCAL * LPFN_GETHOSTNAME)(char*, int); +typedef struct servent*(PASCAL * LPFN_GETSERVBYPORT)(int, const char*); +typedef struct servent*(PASCAL * LPFN_GETSERVBYNAME)(const char*, const char*); +typedef struct protoent*(PASCAL * LPFN_GETPROTOBYNUMBER)(int); +typedef struct protoent*(PASCAL * LPFN_GETPROTOBYNAME)(const char*); + +WINSOCK_API_LINKAGE int PASCAL WSAStartup(WORD,LPWSADATA); +WINSOCK_API_LINKAGE int PASCAL WSACleanup(void); +WINSOCK_API_LINKAGE void PASCAL WSASetLastError(int); +WINSOCK_API_LINKAGE int PASCAL WSAGetLastError(void); +WINSOCK_API_LINKAGE typedef int(PASCAL * LPFN_WSASTARTUP)(WORD, LPWSADATA); +typedef int(PASCAL * LPFN_WSACLEANUP)(void); +typedef void(PASCAL * LPFN_WSASETLASTERROR)(int); +typedef int(PASCAL * LPFN_WSAGETLASTERROR)(void); +/* + * Pseudo-blocking functions are deprecated in WinSock2 + * spec. Use threads instead. + */ +WINSOCK_API_LINKAGE BOOL PASCAL WSAIsBlocking(void); +WINSOCK_API_LINKAGE int PASCAL WSAUnhookBlockingHook(void); +WINSOCK_API_LINKAGE FARPROC PASCAL WSASetBlockingHook(FARPROC); +WINSOCK_API_LINKAGE int PASCAL WSACancelBlockingCall(void); +typedef BOOL(PASCAL * LPFN_WSAISBLOCKING)(void); +typedef int(PASCAL * LPFN_WSAUNHOOKBLOCKINGHOOK)(void); +typedef FARPROC (PASCAL * LPFN_WSASETBLOCKINGHOOK)(FARPROC); +typedef int(PASCAL * LPFN_WSACANCELBLOCKINGCALL)(void); + +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int); +WINSOCK_API_LINKAGE HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int); +WINSOCK_API_LINKAGE int PASCAL WSACancelAsyncRequest(HANDLE); +WINSOCK_API_LINKAGE int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,long); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETSERVBYNAME)(HWND, u_int, const char *, const char *, char *, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETSERVBYPORT)(HWND, u_int, int, const char *, char *, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETPROTOBYNAME)(HWND, u_int, const char*, char*, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETPROTOBYNUMBER)(HWND, u_int, int, char*, int); +typedef HANDLE(PASCAL * LPFN_WSAASYNCGETHOSTBYADDR)(HWND, u_int, const char*, int, int, char*, int); +typedef int(PASCAL * LPFN_WSACANCELASYNCREQUEST)(HANDLE); +typedef int(PASCAL * LPFN_WSAASYNCSELECT)(SOCKET, HWND, u_int, long); +#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) +WINSOCK_API_LINKAGE u_long PASCAL htonl(u_long); +WINSOCK_API_LINKAGE u_long PASCAL ntohl(u_long); +WINSOCK_API_LINKAGE u_short PASCAL htons(u_short); +WINSOCK_API_LINKAGE u_short PASCAL ntohs(u_short); +WINSOCK_API_LINKAGE int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*); +#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */ + +int PASCAL gethostname(char*,int); + +#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e) +#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error) +#define WSAGETASYNCBUFLEN(l) LOWORD(l) +#define WSAGETASYNCERROR(l) HIWORD(l) +#define WSAGETSELECTEVENT(l) LOWORD(l) +#define WSAGETSELECTERROR(l) HIWORD(l) + +typedef struct sockaddr SOCKADDR; +typedef struct sockaddr *PSOCKADDR; +typedef struct sockaddr *LPSOCKADDR; +typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE; +typedef struct sockaddr_in SOCKADDR_IN; +typedef struct sockaddr_in *PSOCKADDR_IN; +typedef struct sockaddr_in *LPSOCKADDR_IN; +typedef struct linger LINGER; +typedef struct linger *PLINGER; +typedef struct linger *LPLINGER; +typedef struct in_addr IN_ADDR; +typedef struct in_addr *PIN_ADDR; +typedef struct in_addr *LPIN_ADDR; +typedef struct fd_set FD_SET; +typedef struct fd_set *PFD_SET; +typedef struct fd_set *LPFD_SET; +typedef struct hostent HOSTENT; +typedef struct hostent *PHOSTENT; +typedef struct hostent *LPHOSTENT; +typedef struct servent SERVENT; +typedef struct servent *PSERVENT; +typedef struct servent *LPSERVENT; +typedef struct protoent PROTOENT; +typedef struct protoent *PPROTOENT; +typedef struct protoent *LPPROTOENT; +typedef struct timeval TIMEVAL; +typedef struct timeval *PTIMEVAL; +typedef struct timeval *LPTIMEVAL; + +/* winsock2 additions */ +#define ADDR_ANY INADDR_ANY + +#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) +#define IN_CLASSD_NET 0xf0000000 +#define IN_CLASSD_NSHIFT 28 +#define IN_CLASSD_HOST 0x0fffffff +#define IN_MULTICAST(i) IN_CLASSD(i) + +#define FROM_PROTOCOL_INFO (-1) + +#define SO_DONTLINGER (u_int)(~SO_LINGER) +#define SO_GROUP_ID 0x2001 +#define SO_GROUP_PRIORITY 0x2002 +#define SO_MAX_MSG_SIZE 0x2003 +#define SO_PROTOCOL_INFOA 0x2004 +#define SO_PROTOCOL_INFOW 0x2005 +#ifdef UNICODE +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW +#else +#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA +#endif +#define PVD_CONFIG 0x3001 + +#define MSG_INTERRUPT 0x10 +#define MSG_MAXIOVLEN 16 + +#define WSAAPI WINAPI +#define WSAEVENT HANDLE +#define LPWSAEVENT LPHANDLE +#define WSAOVERLAPPED OVERLAPPED +typedef struct _OVERLAPPED *LPWSAOVERLAPPED; + +#define WSA_IO_PENDING (ERROR_IO_PENDING) +#define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE) +#define WSA_INVALID_HANDLE (ERROR_INVALID_HANDLE) +#define WSA_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) +#define WSA_NOT_ENOUGH_MEMORY (ERROR_NOT_ENOUGH_MEMORY) +#define WSA_OPERATION_ABORTED (ERROR_OPERATION_ABORTED) + +#define WSA_INVALID_EVENT ((WSAEVENT)NULL) +#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS) +#define WSA_WAIT_FAILED ((DWORD)-1L) +#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0) +#define WSA_WAIT_IO_COMPLETION (WAIT_IO_COMPLETION) +#define WSA_WAIT_TIMEOUT (WAIT_TIMEOUT) +#define WSA_INFINITE (INFINITE) + +typedef struct _WSABUF { + unsigned long len; + char *buf; +} WSABUF, *LPWSABUF; + +typedef enum +{ + BestEffortService, + ControlledLoadService, + PredictiveService, + GuaranteedDelayService, + GuaranteedService +} GUARANTEE; + +/* TODO: FLOWSPEC and related definitions belong in qos.h */ + +/* + Windows Sockets 2 Application Programming Interface, + revision 2.2.2 (1997) uses the type uint32 for SERVICETYPE + and the elements of _flowspec, but the type uint32 is not defined + or used anywhere else in the w32api. For now, just use + unsigned int, which is 32 bits on _WIN32 and _WIN64. +*/ + +typedef unsigned int SERVICETYPE; +typedef struct _flowspec +{ + unsigned int TokenRate; + unsigned int TokenBucketSize; + unsigned int PeakBandwidth; + unsigned int Latency; + unsigned int DelayVariation; + SERVICETYPE ServiceType; + unsigned int MaxSduSize; + unsigned int MinimumPolicedSize; + } FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC; + +typedef struct _QualityOfService +{ + FLOWSPEC SendingFlowspec; + FLOWSPEC ReceivingFlowspec; + WSABUF ProviderSpecific; +} QOS, *LPQOS; + +#define CF_ACCEPT 0x0000 +#define CF_REJECT 0x0001 +#define CF_DEFER 0x0002 +#define SD_RECEIVE 0x00 +#define SD_SEND 0x01 +#define SD_BOTH 0x02 +typedef unsigned int GROUP; + +#define SG_UNCONSTRAINED_GROUP 0x01 +#define SG_CONSTRAINED_GROUP 0x02 +typedef struct _WSANETWORKEVENTS { + long lNetworkEvents; + int iErrorCode[FD_MAX_EVENTS]; +} WSANETWORKEVENTS, *LPWSANETWORKEVENTS; + +#define MAX_PROTOCOL_CHAIN 7 + +#define BASE_PROTOCOL 1 +#define LAYERED_PROTOCOL 0 + +typedef enum _WSAESETSERVICEOP +{ + RNRSERVICE_REGISTER=0, + RNRSERVICE_DEREGISTER, + RNRSERVICE_DELETE +} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP; + +typedef struct _AFPROTOCOLS { + INT iAddressFamily; + INT iProtocol; +} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS; + +typedef enum _WSAEcomparator +{ + COMP_EQUAL = 0, + COMP_NOTLESS +} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR; + +typedef struct _WSAVersion +{ + DWORD dwVersion; + WSAECOMPARATOR ecHow; +} WSAVERSION, *PWSAVERSION, *LPWSAVERSION; + +#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */ +#define __CSADDR_T_DEFINED +typedef struct _SOCKET_ADDRESS { + LPSOCKADDR lpSockaddr; + INT iSockaddrLength; +} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS; +typedef struct _CSADDR_INFO { + SOCKET_ADDRESS LocalAddr; + SOCKET_ADDRESS RemoteAddr; + INT iSocketType; + INT iProtocol; +} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO; +#endif + +typedef struct _SOCKET_ADDRESS_LIST { + INT iAddressCount; + SOCKET_ADDRESS Address[1]; +} SOCKET_ADDRESS_LIST, * LPSOCKET_ADDRESS_LIST; + +#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */ +#define __BLOB_T_DEFINED +typedef struct _BLOB { + ULONG cbSize; + BYTE *pBlobData; +} BLOB,*PBLOB,*LPBLOB; +#endif + +typedef struct _WSAQuerySetA +{ + DWORD dwSize; + LPSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA; + +typedef struct _WSAQuerySetW +{ + DWORD dwSize; + LPWSTR lpszServiceInstanceName; + LPGUID lpServiceClassId; + LPWSAVERSION lpVersion; + LPWSTR lpszComment; + DWORD dwNameSpace; + LPGUID lpNSProviderId; + LPWSTR lpszContext; + DWORD dwNumberOfProtocols; + LPAFPROTOCOLS lpafpProtocols; + LPWSTR lpszQueryString; + DWORD dwNumberOfCsAddrs; + LPCSADDR_INFO lpcsaBuffer; + DWORD dwOutputFlags; + LPBLOB lpBlob; +} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW; + +#ifdef UNICODE +typedef WSAQUERYSETW WSAQUERYSET; +typedef PWSAQUERYSETW PWSAQUERYSET; +typedef LPWSAQUERYSETW LPWSAQUERYSET; +#else +typedef WSAQUERYSETA WSAQUERYSET; +typedef PWSAQUERYSETA PWSAQUERYSET; +typedef LPWSAQUERYSETA LPWSAQUERYSET; +#endif + +#define LUP_DEEP 0x0001 +#define LUP_CONTAINERS 0x0002 +#define LUP_NOCONTAINERS 0x0004 +#define LUP_NEAREST 0x0008 +#define LUP_RETURN_NAME 0x0010 +#define LUP_RETURN_TYPE 0x0020 +#define LUP_RETURN_VERSION 0x0040 +#define LUP_RETURN_COMMENT 0x0080 +#define LUP_RETURN_ADDR 0x0100 +#define LUP_RETURN_BLOB 0x0200 +#define LUP_RETURN_ALIASES 0x0400 +#define LUP_RETURN_QUERY_STRING 0x0800 +#define LUP_RETURN_ALL 0x0FF0 +#define LUP_RES_SERVICE 0x8000 +#define LUP_FLUSHCACHE 0x1000 +#define LUP_FLUSHPREVIOUS 0x2000 + +typedef struct _WSANSClassInfoA +{ + LPSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA; + +typedef struct _WSANSClassInfoW +{ + LPWSTR lpszName; + DWORD dwNameSpace; + DWORD dwValueType; + DWORD dwValueSize; + LPVOID lpValue; +} WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW; + +#ifdef UNICODE +typedef WSANSCLASSINFOW WSANSCLASSINFO; +typedef PWSANSCLASSINFOW PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO; +#else +typedef WSANSCLASSINFOA WSANSCLASSINFO; +typedef PWSANSCLASSINFOA PWSANSCLASSINFO; +typedef LPWSANSCLASSINFOA LPWSANSCLASSINFO; +#endif + +typedef struct _WSAServiceClassInfoA +{ + LPGUID lpServiceClassId; + LPSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOA lpClassInfos; +} WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA; + +typedef struct _WSAServiceClassInfoW +{ + LPGUID lpServiceClassId; + LPWSTR lpszServiceClassName; + DWORD dwCount; + LPWSANSCLASSINFOW lpClassInfos; +} WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW; + +#ifdef UNICODE +typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO; +#else +typedef WSASERVICECLASSINFOA WSASERVICECLASSINFO; +typedef PWSASERVICECLASSINFOA PWSASERVICECLASSINFO; +typedef LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO; +#endif + +typedef struct _WSANAMESPACE_INFOA { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPSTR lpszIdentifier; +} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA; + +typedef struct _WSANAMESPACE_INFOW { + GUID NSProviderId; + DWORD dwNameSpace; + BOOL fActive; + DWORD dwVersion; + LPWSTR lpszIdentifier; +} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW; + +#ifdef UNICODE +typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO; +#else +typedef WSANAMESPACE_INFOA WSANAMESPACE_INFO; +typedef PWSANAMESPACE_INFOA PWSANAMESPACE_INFO; +typedef LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO; +#endif + +typedef struct _WSAPROTOCOLCHAIN { + int ChainLen; + DWORD ChainEntries[MAX_PROTOCOL_CHAIN]; +} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN; + +#define WSAPROTOCOL_LEN 255 + +typedef struct _WSAPROTOCOL_INFOA { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + CHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOA, *LPWSAPROTOCOL_INFOA; + +typedef struct _WSAPROTOCOL_INFOW { + DWORD dwServiceFlags1; + DWORD dwServiceFlags2; + DWORD dwServiceFlags3; + DWORD dwServiceFlags4; + DWORD dwProviderFlags; + GUID ProviderId; + DWORD dwCatalogEntryId; + WSAPROTOCOLCHAIN ProtocolChain; + int iVersion; + int iAddressFamily; + int iMaxSockAddr; + int iMinSockAddr; + int iSocketType; + int iProtocol; + int iProtocolMaxOffset; + int iNetworkByteOrder; + int iSecurityScheme; + DWORD dwMessageSize; + DWORD dwProviderReserved; + WCHAR szProtocol[WSAPROTOCOL_LEN+1]; +} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW; + +typedef int (CALLBACK *LPCONDITIONPROC)(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD); +typedef void (WINAPI *LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPWSAOVERLAPPED, DWORD); + + +#ifdef UNICODE +typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO; +#else +typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO; +typedef LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO; +#endif + +/* Needed for XP & .NET Server function WSANSPIoctl. */ +typedef enum _WSACOMPLETIONTYPE { + NSP_NOTIFY_IMMEDIATELY = 0, + NSP_NOTIFY_HWND, + NSP_NOTIFY_EVENT, + NSP_NOTIFY_PORT, + NSP_NOTIFY_APC +} WSACOMPLETIONTYPE, * PWSACOMPLETIONTYPE, * LPWSACOMPLETIONTYPE; +typedef struct _WSACOMPLETION { + WSACOMPLETIONTYPE Type; + union { + struct { + HWND hWnd; + UINT uMsg; + WPARAM context; + } WindowMessage; + struct { + LPWSAOVERLAPPED lpOverlapped; + } Event; + struct { + LPWSAOVERLAPPED lpOverlapped; + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc; + } Apc; + struct { + LPWSAOVERLAPPED lpOverlapped; + HANDLE hPort; + ULONG_PTR Key; + } Port; + } Parameters; +} WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION; + +#define PFL_MULTIPLE_PROTO_ENTRIES 0x00000001 +#define PFL_RECOMMENDED_PROTO_ENTRY 0x00000002 +#define PFL_HIDDEN 0x00000004 +#define PFL_MATCHES_PROTOCOL_ZERO 0x00000008 +#define XP1_CONNECTIONLESS 0x00000001 +#define XP1_GUARANTEED_DELIVERY 0x00000002 +#define XP1_GUARANTEED_ORDER 0x00000004 +#define XP1_MESSAGE_ORIENTED 0x00000008 +#define XP1_PSEUDO_STREAM 0x00000010 +#define XP1_GRACEFUL_CLOSE 0x00000020 +#define XP1_EXPEDITED_DATA 0x00000040 +#define XP1_CONNECT_DATA 0x00000080 +#define XP1_DISCONNECT_DATA 0x00000100 +#define XP1_SUPPORT_BROADCAST 0x00000200 +#define XP1_SUPPORT_MULTIPOINT 0x00000400 +#define XP1_MULTIPOINT_CONTROL_PLANE 0x00000800 +#define XP1_MULTIPOINT_DATA_PLANE 0x00001000 +#define XP1_QOS_SUPPORTED 0x00002000 +#define XP1_INTERRUPT 0x00004000 +#define XP1_UNI_SEND 0x00008000 +#define XP1_UNI_RECV 0x00010000 +#define XP1_IFS_HANDLES 0x00020000 +#define XP1_PARTIAL_MESSAGE 0x00040000 + +#define BIGENDIAN 0x0000 +#define LITTLEENDIAN 0x0001 + +#define SECURITY_PROTOCOL_NONE 0x0000 +#define JL_SENDER_ONLY 0x01 +#define JL_RECEIVER_ONLY 0x02 +#define JL_BOTH 0x04 +#define WSA_FLAG_OVERLAPPED 0x01 +#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02 +#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04 +#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08 +#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10 +#define IOC_UNIX 0x00000000 +#define IOC_WS2 0x08000000 +#define IOC_PROTOCOL 0x10000000 +#define IOC_VENDOR 0x18000000 + +#define _WSAIO(x,y) (IOC_VOID|(x)|(y)) +#define _WSAIOR(x,y) (IOC_OUT|(x)|(y)) +#define _WSAIOW(x,y) (IOC_IN|(x)|(y)) +#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y)) + +#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1) +#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2) +#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3) +#define SIO_FLUSH _WSAIO(IOC_WS2,4) +#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5) +#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6) +#define SIO_GET_QOS _WSAIORW(IOC_WS2,7) +#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8) +#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9) +#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10) +#define SIO_SET_QOS _WSAIOW(IOC_WS2,11) +#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12) +#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13) +#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20) +#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21) +#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22) +#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23) +#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24) +#define SIO_NSP_NOTIFY_CHANGE _WSAIOW(IOC_WS2,25) + +#define TH_NETDEV 0x00000001 +#define TH_TAPI 0x00000002 + +WINSOCK_API_LINKAGE SOCKET WINAPI WSAAccept(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +WINSOCK_API_LINKAGE BOOL WINAPI WSACloseEvent(WSAEVENT); +WINSOCK_API_LINKAGE int WINAPI WSAConnect(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +WINSOCK_API_LINKAGE WSAEVENT WINAPI WSACreateEvent(void); +WINSOCK_API_LINKAGE int WINAPI WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +WINSOCK_API_LINKAGE int WINAPI WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +WINSOCK_API_LINKAGE INT WINAPI WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW); +WINSOCK_API_LINKAGE int WINAPI WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +WINSOCK_API_LINKAGE int WINAPI WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAEventSelect(SOCKET, WSAEVENT, long); +WINSOCK_API_LINKAGE BOOL WINAPI WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +WINSOCK_API_LINKAGE BOOL WINAPI WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD); +WINSOCK_API_LINKAGE int WINAPI WSAHtonl(SOCKET, unsigned long, unsigned long *); +WINSOCK_API_LINKAGE int WINAPI WSAHtons(SOCKET, unsigned short, unsigned short *); +WINSOCK_API_LINKAGE INT WINAPI WSAInstallServiceClassA(LPWSASERVICECLASSINFOA); +WINSOCK_API_LINKAGE INT WINAPI WSAInstallServiceClassW(LPWSASERVICECLASSINFOW); +WINSOCK_API_LINKAGE int WINAPI WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE SOCKET WINAPI WSAJoinLeaf(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +WINSOCK_API_LINKAGE INT WINAPI WSALookupServiceEnd(HANDLE); +WINSOCK_API_LINKAGE int WINAPI WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */ +WINSOCK_API_LINKAGE int WINAPI WSANtohl(SOCKET, unsigned long, unsigned long *); +WINSOCK_API_LINKAGE int WINAPI WSANtohs(SOCKET, unsigned short, unsigned short *); +WINSOCK_API_LINKAGE int WINAPI WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE int WINAPI WSARecvDisconnect(SOCKET, LPWSABUF); +WINSOCK_API_LINKAGE int WINAPI WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE INT WINAPI WSARemoveServiceClass(LPGUID); +WINSOCK_API_LINKAGE BOOL WINAPI WSAResetEvent(WSAEVENT); +WINSOCK_API_LINKAGE int WINAPI WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE int WINAPI WSASendDisconnect(SOCKET, LPWSABUF); +WINSOCK_API_LINKAGE int WINAPI WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +WINSOCK_API_LINKAGE BOOL WINAPI WSASetEvent(WSAEVENT); +WINSOCK_API_LINKAGE INT WSAAPI WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +WINSOCK_API_LINKAGE SOCKET WINAPI WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +WINSOCK_API_LINKAGE SOCKET WINAPI WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +WINSOCK_API_LINKAGE INT WINAPI WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +WINSOCK_API_LINKAGE INT WINAPI WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +WINSOCK_API_LINKAGE DWORD WINAPI WSAWaitForMultipleEvents(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); + +typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGA)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGW)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSACLOSEEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSACONNECT)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS); +typedef WSAEVENT (WINAPI *LPFN_WSACREATEEVENT)(void); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETA)(SOCKET, DWORD, LPWSAPROTOCOL_INFOA); +typedef int (WINAPI *LPFN_WSADUPLICATESOCKETW)(SOCKET, DWORD, LPWSAPROTOCOL_INFOW); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)(LPDWORD, LPWSANAMESPACE_INFOA); +typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)(LPDWORD, LPWSANAMESPACE_INFOW); +typedef int (WINAPI *LPFN_WSAENUMNETWORKEVENTS)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSA)(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD); +typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSW)(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD); +typedef int (WINAPI *LPFN_WSAEVENTSELECT)(SOCKET, WSAEVENT, long); +typedef BOOL (WINAPI *LPFN_WSAGETOVERLAPPEDRESULT)(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD); +typedef BOOL (WINAPI *LPFN_WSAGETQOSBYNAME)(SOCKET, LPWSABUF, LPQOS); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOA)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOW)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)(LPGUID, LPSTR, LPDWORD); +typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)(LPGUID, LPWSTR, LPDWORD); +typedef int (WINAPI *LPFN_WSAHTONL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSAHTONS)(SOCKET, unsigned short, unsigned short *); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSA)(LPWSASERVICECLASSINFOA); +typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSW)(LPWSASERVICECLASSINFOW); +typedef int (WINAPI *LPFN_WSAIOCTL)(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef SOCKET (WINAPI *LPFN_WSAJOINLEAF)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINA)(LPWSAQUERYSETA, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINW)(LPWSAQUERYSETW, DWORD, LPHANDLE); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTA)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTW)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW); +typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEEND)(HANDLE); +typedef int (WINAPI *LPFN_WSANSPIoctl)(HANDLE, DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); +typedef int (WINAPI *LPFN_WSANTOHL)(SOCKET, unsigned long, unsigned long *); +typedef int (WINAPI *LPFN_WSANTOHS)(SOCKET, unsigned short, unsigned short *); +typedef int (WINAPI *LPFN_WSARECV)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSARECVDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSARECVFROM)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef INT (WINAPI *LPFN_WSAREMOVESERVICECLASS)(LPGUID); +typedef BOOL (WINAPI *LPFN_WSARESETEVENT)(WSAEVENT); +typedef int (WINAPI *LPFN_WSASEND)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef int (WINAPI *LPFN_WSASENDDISCONNECT)(SOCKET, LPWSABUF); +typedef int (WINAPI *LPFN_WSASENDTO)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); +typedef BOOL (WINAPI *LPFN_WSASETEVENT)(WSAEVENT); +typedef INT (WINAPI *LPFN_WSASETSERVICEA)(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD); +typedef INT (WINAPI *LPFN_WSASETSERVICEW)(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETA)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD); +typedef SOCKET (WINAPI *LPFN_WSASOCKETW)(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSA)(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT); +typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSW)(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT); +typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL); + +#ifdef UNICODE +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGW +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW +#define LPFN_WSASOCKET LPFN_WSASOCKETW +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW +#define WSAAddressToString WSAAddressToStringW +#define WSADuplicateSocket WSADuplicateSocketW +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW +#define WSAEnumProtocols WSAEnumProtocolsW +#define WSAGetServiceClassInfo WSAGetServiceClassInfoW +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW +#define WSASetService WSASetServiceW +#define WSASocket WSASocketW +#define WSAStringToAddress WSAStringToAddressW +#define WSALookupServiceBegin WSALookupServiceBeginW +#define WSALookupServiceNext WSALookupServiceNextW +#define WSAInstallServiceClass WSAInstallServiceClassW +#else +#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGA +#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW +#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSA +#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSA +#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOA +#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA +#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSA +#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINA +#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTA +#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEA +#define LPFN_WSASOCKET LPFN_WSASOCKETA +#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSA +#define WSAAddressToString WSAAddressToStringA +#define WSADuplicateSocket WSADuplicateSocketA +#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA +#define WSAEnumProtocols WSAEnumProtocolsA +#define WSAGetServiceClassInfo WSAGetServiceClassInfoA +#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdA +#define WSAInstallServiceClass WSAInstallServiceClassA +#define WSALookupServiceBegin WSALookupServiceBeginA +#define WSALookupServiceNext WSALookupServiceNextA +#define WSASocket WSASocketA +#define WSAStringToAddress WSAStringToAddressA +#define WSASetService WSASetServiceA +#endif + +#ifdef __cplusplus +} +#endif +#endif From 71fd5c5aee8515b81af1965c8bdbd414ed3c8bbf Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sun, 10 Sep 2017 23:02:33 -0400 Subject: [PATCH 08/15] Fix Linux compile issues. --- colorchord2/main.c | 2 +- colorchord2/netlight.conf | 3 ++- colorchord2/outdrivers.h | 2 +- colorchord2/parameters.h | 2 +- colorchord2/sound.h | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/colorchord2/main.c b/colorchord2/main.c index 4136a90..0f766bf 100644 --- a/colorchord2/main.c +++ b/colorchord2/main.c @@ -17,11 +17,11 @@ #include "parameters.h" #include "hook.h" #include "configs.h" -#include struct SoundDriver * sd; #if defined(WIN32) || defined(USE_WINDOWS) +#include #include #define ESCAPE_KEY 0x1B diff --git a/colorchord2/netlight.conf b/colorchord2/netlight.conf index c426aad..edc1ce1 100644 --- a/colorchord2/netlight.conf +++ b/colorchord2/netlight.conf @@ -12,7 +12,8 @@ steady_bright = 0 #dft_q = 20.0000 #dft_speedup = 1000.0000 -sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1.monitor +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor +# alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1.monitor #alsa_output.pci-0000_00_1f.3.analog-stereo.monitor skipfirst = 1 firstval = 0 diff --git a/colorchord2/outdrivers.h b/colorchord2/outdrivers.h index db3afce..44db767 100644 --- a/colorchord2/outdrivers.h +++ b/colorchord2/outdrivers.h @@ -41,6 +41,6 @@ struct DriverInstances * SetupOutDriver( ); void RegOutDriver( const char * ron, struct DriverInstances * (*Init)( ) ); #define REGISTER_OUT_DRIVER( name ) \ - void REGISTER##name() __attribute__((constructor)) { RegOutDriver( #name, name ); } + void __attribute__((constructor)) REGISTER##name() { RegOutDriver( #name, name ); } #endif diff --git a/colorchord2/parameters.h b/colorchord2/parameters.h index b6c2fe2..db1eecf 100644 --- a/colorchord2/parameters.h +++ b/colorchord2/parameters.h @@ -58,7 +58,7 @@ void SetParametersFromString( const char * string ); void AddCallback( const char * name, ParamCallbackT t, void * v ); #define REGISTER_PARAM( parameter_name, type ) \ - void REGISTER##parameter_name() __attribute__((constructor)) { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } + void __attribute__((constructor)) REGISTER##parameter_name() { RegisterValue( #parameter_name, type, ¶meter_name, sizeof( parameter_name ) ); } #endif diff --git a/colorchord2/sound.h b/colorchord2/sound.h index d83ed9b..38a7f19 100644 --- a/colorchord2/sound.h +++ b/colorchord2/sound.h @@ -35,7 +35,7 @@ void CloseSound( struct SoundDriver * soundobject ); void RegSound( int priority, const char * name, SoundInitFn * fn ); #define REGISTER_SOUND( sounddriver, priority, name, function ) \ - void REGISTER##sounddriver() __attribute__((constructor)) { RegSound( priority, name, function ); } + void __attribute__((constructor)) REGISTER##sounddriver() { RegSound( priority, name, function ); } #endif From 1d86a1c52e59635994d1ed32229021031b65450d Mon Sep 17 00:00:00 2001 From: cnlohr Date: Sun, 10 Sep 2017 23:10:37 -0400 Subject: [PATCH 09/15] Add image files and update to newest everything. --- embedded8266/ccconfig.h | 2 ++ embedded8266/esp82xx | 2 +- embedded8266/image.elf-0x00000.bin | Bin 0 -> 37312 bytes embedded8266/image.elf-0x40000.bin | Bin 0 -> 213712 bytes embedded8266/user.cfg | 2 +- embedded8266/user/custom_commands.c | 8 ++++---- embedded8266/user/user_main.c | 6 ++++-- 7 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 embedded8266/image.elf-0x00000.bin create mode 100644 embedded8266/image.elf-0x40000.bin diff --git a/embedded8266/ccconfig.h b/embedded8266/ccconfig.h index b94ed85..02b9c33 100644 --- a/embedded8266/ccconfig.h +++ b/embedded8266/ccconfig.h @@ -29,6 +29,7 @@ #define USE_NUM_LIN_LEDS CCS.gUSE_NUM_LIN_LEDS #define COLORCHORD_OUTPUT_DRIVER CCS.gCOLORCHORD_OUTPUT_DRIVER #define COLORCHORD_ACTIVE CCS.gCOLORCHORD_ACTIVE +#define INITIAL_AMP CCS.gINITIAL_AMP //We are not enabling these for the ESP8266 port. #define LIN_WRAPAROUND 0 @@ -54,6 +55,7 @@ struct CCSettings uint8_t gUSE_NUM_LIN_LEDS; // = NUM_LIN_LEDS uint8_t gCOLORCHORD_ACTIVE; uint8_t gCOLORCHORD_OUTPUT_DRIVER; + uint8_t gINITIAL_AMP; }; extern struct CCSettings CCS; diff --git a/embedded8266/esp82xx b/embedded8266/esp82xx index 6666ee9..248dcac 160000 --- a/embedded8266/esp82xx +++ b/embedded8266/esp82xx @@ -1 +1 @@ -Subproject commit 6666ee94f388b9038fc9382b813287be65c20283 +Subproject commit 248dcac4022bf1e3d3574f2f49626c99d794dd06 diff --git a/embedded8266/image.elf-0x00000.bin b/embedded8266/image.elf-0x00000.bin new file mode 100644 index 0000000000000000000000000000000000000000..6d69844142d381c7af03d26290c8178f02c817fe GIT binary patch literal 37312 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%0A^6@&@q z2yz4!f|Y{T1Um&s1%DU(BJdQB6+SF{R5)MwxUfW6BYaWVD*Ti1E#U{k-NJpsF5#EL zZsB*rlfpB?zX{L6oq_*5#C?gheaQ0x^8N|WyohH@0Am4QJq(zh!e0RYD9U*aZffA@;c*f8b^`Bw;2*-?MO}8FPNk?@7*uf1qONOD=M>bPkh9L+ z&NgScGsPJW!_j9QA3I)kEOn$h9(H&+ejGSB&@u4Bz*7Tr1||#)^nc&KufL;zMSoF$ zO252c+<*Jt*?R}>y?bxP5@?K zpFiMFLpcQ~Z#Bw2fbwtO69bo&eiQKO0Dj;15A;tMm<^m?7-%0jFmP$W3w23#SWvHz z9cLZH8HT!+q0YOVe{=5rZ^zuP;ZDH)2zM9Grv-Ll;bP%5aOrSHxRr40;5Ng30(T7V zG8~A=|HgPjuHrY!eW!jZGyjznAP?+E>P2vYaMnk{RE==w;OuZWV!~7xm0_w8lfzV_ z;i&&#xz7>*2+~g|!c-UFuENoL_i(53-04(n5)!pZ$@5Yko4+7+;UZmHdPZhec1~{I zVnacp(NttEE?M$)X<2!NWvR8Ys`{Cl+GWqeY-ik*sng=8&v;}qA=h4U%)JSB8_ogO z2S@8h-(&a4J?5SVb;Of_mZ_J3)u}`yoD9}uUwYRu_YZLY4c7wqGTbV-SKwOVR>QTy zt$}+L?vHS5;nu;ehuZ*0%NZ5$e84{g9v|`bh{V9p0%wW;D%J#j8I(KnA0uBFH8yy6 z@L~xw`u)-RF_N+0j(v696Ctj8(_Z3z6lk0tgx!2qI@P-SXxnO^7r-kO)4oh zaplNVL^H+Qe>hg5;1)gY?@Rv0V~DCUl~>6Zn99vn#WT6z=OKJ?e5TB078A0RS>lMH z+E`LCxy)iR$B`wKG3IAU720a@62miw%0g?2rHT|*-j9agm2N3Dl#~yHs4Xw7Frx8i za^`1CEGWrPSZtD0q^uRCGjRlTL1{_hB(BU*D>s-;v*V^I6fQu;Rb{1sgG!|&r|P)J zDoVQdI>YTuyO?x-7+)NRzbT zAU5tA_dS)rC*`<;(4LAC@!?`q^j?xjMm}2z7lj(@kWYEh3J|D$rdabKOTq%}F zOj$rLG;az4u$aMr1l-smmPnJs3&V}RgujvG6yBfY2AiBb=*d7{`~&X<4M_m%G)xi} zxNfOFQDn|Jv?dPu7A0h=v$Yv~ zY*I?DMyE|*#0M5G%G9Q-7ba`@P{yM4%zPTf=Oortb?#8ex-cs>e?iK^`~})X7a$tQ zNmuLC>5H-!Ch`D&9|in!fM+%_r!QLM0-nDpDJesnNz92!nJFph#GI71cyT^_`I?l> z3ojM~!i?|GJY6?vS;+m9�<>xAInPBN-3&KXVa<3H>Im8VFOO{4J1lBZR;Dg1Ge0pM2>=fS zGE>~JAvsO8F+AI3L9ALJK1@bTo)nrmu$!@j3KL(Kgre8tYO{&nsTi9}J-pPKOHy@7 z8Pt)~qzqmn@xq2PRB=|5xw_O~MYq_DSE>ogz^L%bXkU_HDwOA#3Nk7RpEgy==bM&6A}y@oYD@){d=&SzX_;FD`VwRu z7F$(O!4;I4fm2F3WO9k|-#wKvUz^8eBDaRm9XoZpR-L4tD%Z|XPLWTEPgKiiOifVB z6Q-&)io}HJQ#DE@$to{1R6Y%wS_~936p~e5S#7aYSSg_`hGnG{hGB{KF-x)<%w>?l zCSwd<0r*E9Yf7pLi>WNCs+h^i!YgHy=>;@3P7XIlV_QK+MoMBnIzPx`K018V4*TBxk9bu@FK2s!{y2Av^hQc8uAyN{sGT2WO|SW#N(@0(>YTMZQ6P!m7+0(7VQ`##t+)P;p63%U=fu$an8 zjmbi4EC%ZG;bO@Gv<4+`hKU#Ym9(G5)^d|6rb8EC>rUpX@qPi5pw~Q08;VOA3;_rT zsLjyj13>PeBZ;OWLv?8tdfL!a+(JVcszE6>1eT&Ax>g7lC)V%0fdqSAc$w{`sG@`67#}NAQJL zf%7ZMf7eH%3Mwm0j2Kx}%|sXX9VFnt0q@HXB1$W)3B?sw`jW=@N1e4G6F&Sv&G2gY zs!Ga;c4jJH>F`?4P--<9jF1i(W`Ycalo?9MB#iFHIHvIPD)cNK+JZa`bO(AbGZYdF chKohGSTGnhnw}x^uop{#JuWnT*zb$~1#GQ=82|tP literal 0 HcmV?d00001 diff --git a/embedded8266/image.elf-0x40000.bin b/embedded8266/image.elf-0x40000.bin new file mode 100644 index 0000000000000000000000000000000000000000..13b21fd1e714dd4bfa02e7c623d8852aee392cbc GIT binary patch literal 213712 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 b(EHK{H}srh8+vGdRjuDlwruG6A@2VHz>1Su literal 0 HcmV?d00001 diff --git a/embedded8266/user.cfg b/embedded8266/user.cfg index 4677ca8..923a30e 100644 --- a/embedded8266/user.cfg +++ b/embedded8266/user.cfg @@ -15,7 +15,7 @@ ESP_GCC_VERS = 4.8.5 #SDK = $(HOME)/esp8266/esp_iot_sdk_v1.5.2 PAGE_SCRIPTS = main.js -FWBURNFLAGS = -b 1500000 +FWBURNFLAGS = -b 2000000 OPTS += -DICACHE_FLASH OPTS += -DDISABLE_CHARRX #Saves about 48 bytes. diff --git a/embedded8266/user/custom_commands.c b/embedded8266/user/custom_commands.c index 6832a76..3a04c75 100644 --- a/embedded8266/user/custom_commands.c +++ b/embedded8266/user/custom_commands.c @@ -11,7 +11,7 @@ extern volatile uint8_t sounddata[]; extern volatile uint16_t soundhead; -#define CONFIGURABLES 17 //(plus1) +#define CONFIGURABLES 18 //(plus1) struct SaveLoad @@ -22,17 +22,17 @@ struct SaveLoad struct CCSettings CCS; -uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 0 }; +uint8_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 16, 0 }; uint8_t * gConfigurables[CONFIGURABLES] = { &CCS.gROOT_NOTE_OFFSET, &CCS.gDFTIIR, &CCS.gFUZZ_IIR_BITS, &CCS.gFILTER_BLUR_PASSES, &CCS.gSEMIBITSPERBIN, &CCS.gMAX_JUMP_DISTANCE, &CCS.gMAX_COMBINE_DISTANCE, &CCS.gAMP_1_IIR_BITS, &CCS.gAMP_2_IIR_BITS, &CCS.gMIN_AMP_FOR_NOTE, &CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &CCS.gNOTE_FINAL_AMP, - &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, 0 }; + &CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, &CCS.gINITIAL_AMP, 0 }; char * gConfigurableNames[CONFIGURABLES] = { "gROOT_NOTE_OFFSET", "gDFTIIR", "gFUZZ_IIR_BITS", "gFILTER_BLUR_PASSES", "gSEMIBITSPERBIN", "gMAX_JUMP_DISTANCE", "gMAX_COMBINE_DISTANCE", "gAMP_1_IIR_BITS", "gAMP_2_IIR_BITS", "gMIN_AMP_FOR_NOTE", "gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR", "gNOTE_FINAL_AMP", - "gNERF_NOTE_PORP", "gUSE_NUM_LIN_LEDS", "gCOLORCHORD_ACTIVE", "gCOLORCHORD_OUTPUT_DRIVER", 0 }; + "gNERF_NOTE_PORP", "gUSE_NUM_LIN_LEDS", "gCOLORCHORD_ACTIVE", "gCOLORCHORD_OUTPUT_DRIVER", "gINITIAL_AMP", 0 }; void ICACHE_FLASH_ATTR CustomStart( ) { diff --git a/embedded8266/user/user_main.c b/embedded8266/user/user_main.c index 0a2d696..a047897 100644 --- a/embedded8266/user/user_main.c +++ b/embedded8266/user/user_main.c @@ -99,9 +99,11 @@ static void procTask(os_event_t *events) #endif while( soundtail != soundhead ) { - int16_t samp = sounddata[soundtail]; + int32_t samp = sounddata[soundtail]; samp_iir = samp_iir - (samp_iir>>10) + samp; - PushSample32( (samp - (samp_iir>>10))*16 ); + samp = (samp - (samp_iir>>10))*16; + samp = (samp * CCS.gINITIAL_AMP) >> 4; + PushSample32( samp ); soundtail = (soundtail+1)&(HPABUFFSIZE-1); wf++; From 941b75f0a679782edff0baebff377cf3639e8102 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 11 Sep 2017 23:17:22 -0400 Subject: [PATCH 10/15] Add the mpfs --- embedded8266/web/page.mpfs | Bin 0 -> 74240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 embedded8266/web/page.mpfs diff --git a/embedded8266/web/page.mpfs b/embedded8266/web/page.mpfs new file mode 100644 index 0000000000000000000000000000000000000000..248e4c7f5ec7b322d8ca3633b4205a8a3c314d3d GIT binary patch literal 74240 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

-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 literal 0 HcmV?d00001 From 9d873cf9b5e96f0a7626bbc45974843e73f14e0f Mon Sep 17 00:00:00 2001 From: OleLL Date: Mon, 30 Oct 2017 23:30:51 +0100 Subject: [PATCH 11/15] Fixed missing atoi + changed Init to InitColorChord --- embeddedlinux/embeddedcc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/embeddedlinux/embeddedcc.c b/embeddedlinux/embeddedcc.c index ee663eb..4ce7ea5 100644 --- a/embeddedlinux/embeddedcc.c +++ b/embeddedlinux/embeddedcc.c @@ -11,6 +11,7 @@ #include #include #include +#include // Added by [olel] for atoi #include "embeddedout.h" struct sockaddr_in servaddr; @@ -64,7 +65,7 @@ int main( int argc, char ** argv ) connect( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) ); - Init(); + InitColorChord(); // Changed by [olel] cause this was changed in embeddednf while( ( ci = getchar() ) != EOF ) { From ad4f2d6d093e0f1f3523748cfba0e730226e7d46 Mon Sep 17 00:00:00 2001 From: OleLL Date: Mon, 30 Oct 2017 23:31:41 +0100 Subject: [PATCH 12/15] Removed -m32 to allow also 64 bit architectures --- embeddedlinux/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/embeddedlinux/Makefile b/embeddedlinux/Makefile index 8ccdf93..961cce3 100644 --- a/embeddedlinux/Makefile +++ b/embeddedlinux/Makefile @@ -7,7 +7,7 @@ LDFLAGS:= -s -Wl,--relax -Wl,-Map=test.map -Wl,--gc-sections -ffunction-section embeddedcc : ../embeddedcommon/embeddednf.c ../embeddedcommon/DFT32.c embeddedcc.c ../embeddedcommon/embeddedout.c - gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) -m32 + gcc -o $@ $^ $(CFLAGS) $(LDFLAGS) dummy_leds : dummy_leds.c gcc -o $@ $^ -lX11 -lpthread $(CFLAGS) $(LDFLAGS) From c158ca0b5b562184bc85185486095c0a30188dd0 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:13:06 -0400 Subject: [PATCH 13/15] Add SHM display for outputting directly to shared memory. --- colorchord2/DisplaySHM.c | 77 ++++++++++++++++++++++++++++++++++++++++ colorchord2/Makefile | 4 +-- 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 colorchord2/DisplaySHM.c diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c new file mode 100644 index 0000000..554759d --- /dev/null +++ b/colorchord2/DisplaySHM.c @@ -0,0 +1,77 @@ +//Copyright 2015 <>< Charles Lohr under the ColorChord License. + +#include "outdrivers.h" +#include "notefinder.h" +#include +#include "parameters.h" +#include +#include +#include +#include "color.h" +#include "DrawFunctions.h" +#include +#include /* For mode constants */ +#include /* For O_* constants */ +#include + +struct SHMDriver +{ + int lights_file; + //int dft_file; //Not available. + //uint8_t * dft_ptr; + uint8_t * lights_ptr; + //int total_dft; + int total_leds; +}; + + +static void SHMUpdate(void * id, struct NoteFinder*nf) +{ + struct SHMDriver * d = (struct SHMDriver*)id; + + + if( !d->lights_file ) + { + const char * shm_lights = GetParameterS( "shm_lights", 0 ); + //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. + + if( shm_lights ) + { + d->lights_file = shm_open(shm_lights, O_CREAT | O_RDWR, 0644); + ftruncate( d->lights_file, 16384 ); + d->lights_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->lights_file, 0); + } + + printf( "Got SHM: %s->%d [%p]\n", shm_lights, d->lights_file, d->lights_ptr ); + } + + + if( d->lights_ptr ) + { + memcpy( d->lights_ptr, &d->total_leds, 4 ); + memcpy( d->lights_ptr + 4, OutLEDs, d->total_leds*3 ); + } + +} + +static void SHMParams(void * id ) +{ + struct SHMDriver * d = (struct SHMDriver*)id; + + d->total_leds = 300; RegisterValue( "leds", PAINT, &d->total_leds, sizeof( d->total_leds )); +} + +static struct DriverInstances * DisplaySHM(const char * parameters) +{ + struct DriverInstances * ret = malloc( sizeof( struct DriverInstances ) ); + struct SHMDriver * d = ret->id = malloc( sizeof( struct SHMDriver ) ); + memset( d, 0, sizeof( struct SHMDriver ) ); + ret->Func = SHMUpdate; + ret->Params = SHMParams; + SHMParams( d ); + return ret; +} + +REGISTER_OUT_DRIVER(DisplaySHM); + + diff --git a/colorchord2/Makefile b/colorchord2/Makefile index 5a7c35b..97b2fcf 100644 --- a/colorchord2/Makefile +++ b/colorchord2/Makefile @@ -3,14 +3,14 @@ all : colorchord RAWDRAW:=DrawFunctions.o XDriver.o SOUND:=sound.o sound_alsa.o sound_pulse.o sound_null.o -OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o +OUTS := OutputVoronoi.o DisplayArray.o OutputLinear.o DisplayPie.o DisplayNetwork.o DisplayUSB2812.o DisplayDMX.o OutputProminent.o RecorderPlugin.o DisplayHIDAPI.o hidapi.o OutputCells.o DisplaySHM.o WINGCC:= i686-w64-mingw32-gcc WINGCCFLAGS:= -g -DICACHE_FLASH_ATTR= -I../embeddedcommon -I. -O1 #-O2 -Wl,--relax -Wl,--gc-sections -ffunction-sections -fdata-sections WINLDFLAGS:=-lwinmm -lgdi32 -lws2_32 -lsetupapi RAWDRAWLIBS:=-lX11 -lm -lpthread -lXinerama -lXext -LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev +LDLIBS:=-lpthread -lasound -lm -lpulse-simple -lpulse -ludev -lrt CFLAGS:=-g -Os -flto -Wall -ffast-math -I../embeddedcommon -I. -DICACHE_FLASH_ATTR= From 1908c75cf8a07e818f11eae365f1ff7c098e41ca Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:32:50 -0400 Subject: [PATCH 14/15] Bump shm test --- colorchord2/DisplaySHM.c | 37 ++++++++++++++++++++++++++---- colorchord2/shmtest.conf | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 colorchord2/shmtest.conf diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c index 554759d..55f2c3e 100644 --- a/colorchord2/DisplaySHM.c +++ b/colorchord2/DisplaySHM.c @@ -14,13 +14,16 @@ #include /* For O_* constants */ #include +extern struct NoteFinder * nf; + + struct SHMDriver { int lights_file; - //int dft_file; //Not available. - //uint8_t * dft_ptr; + int dft_file; //Not available. + uint8_t * dft_ptr; uint8_t * lights_ptr; - //int total_dft; + int total_dft; int total_leds; }; @@ -29,7 +32,6 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) { struct SHMDriver * d = (struct SHMDriver*)id; - if( !d->lights_file ) { const char * shm_lights = GetParameterS( "shm_lights", 0 ); @@ -46,6 +48,33 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) } + if( !d->dft_file ) + { + const char * shmname = GetParameterS( "shm_dft", 0 ); + //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. + + if( shmname ) + { + d->dft_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); + ftruncate( d->dft_file, 16384 ); + d->dft_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->dft_file, 0); + } + + printf( "Got SHM: %s->%d [%p]\n", shmname, d->dft_file, d->dft_ptr ); + } + + + if( d->dft_ptr ) + { + + d->total_dft = nf->octaves * nf->freqbins; + memcpy( d->dft_ptr+0, &nf->octaves, 4 ); + memcpy( d->dft_ptr+4, &nf->freqbins, 4 ); + memcpy( d->dft_ptr+8, nf->folded_bins, nf->freqbins * sizeof(float) ); + memcpy( d->dft_ptr+8+nf->freqbins * sizeof(float), + nf->outbins, d->total_dft * sizeof(float) ); + } + if( d->lights_ptr ) { memcpy( d->lights_ptr, &d->total_leds, 4 ); diff --git a/colorchord2/shmtest.conf b/colorchord2/shmtest.conf new file mode 100644 index 0000000..fe205d2 --- /dev/null +++ b/colorchord2/shmtest.conf @@ -0,0 +1,49 @@ +cpu_autolimit = 1 + +#General GUI properties. +title = PA Test +set_screenx = 720 +set_screeny = 480 + +sample_channel = -1 +sourcename = alsa_output.pci-0000_01_00.1.hdmi-stereo-extra2.monitor +#alsa_output.pci-0000_00_1f.3.analog-stereo.monitor +#default +# alsa_output.pci-0000_00_1b.0.analog-stereo.monitor +#alsa_output.pci-0000_00_1f.3.analog-stereo.monitor << New laptop +#use pactl list | grep pci- | grep monitor + + +#How many bins a note can jump from frame to frame to be considered a slide. +#this is used to prevent notes from popping in and out a lot. +note_combine_distance = 0.5000 +note_jumpability = 1.8000 +note_minimum_new_distribution_value = 0.0200 +note_out_chop = 0.05000 + +#compress_coefficient = 4.0 +#compress_exponent = .5 + + +#======================================================================= +#Outputs + + +#DisplayArray +outdrivers = OutputCells, DisplaySHM + +shm_lights = /cclights +shm_dft = /ccdft + +lightx = 20 +lighty = 4 +fromsides = 1 +leds = 120 +qtyamp = 120 + +satamp = 2.800 +amppow = 2.510 +distpow = 1.500 + + + From b786fd1f45c11781640e7d2f94f9f7c726f1ead5 Mon Sep 17 00:00:00 2001 From: cnlohr Date: Mon, 7 May 2018 23:47:06 -0400 Subject: [PATCH 15/15] Bump. Expose notes, too! --- colorchord2/DisplaySHM.c | 37 ++++++++++++++++++++++++++----------- colorchord2/shmtest.conf | 1 + 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/colorchord2/DisplaySHM.c b/colorchord2/DisplaySHM.c index 55f2c3e..e4eb3e1 100644 --- a/colorchord2/DisplaySHM.c +++ b/colorchord2/DisplaySHM.c @@ -20,9 +20,13 @@ extern struct NoteFinder * nf; struct SHMDriver { int lights_file; - int dft_file; //Not available. + int dft_file; + int notes_file; + uint8_t * dft_ptr; uint8_t * lights_ptr; + uint8_t * notes_ptr; + int total_dft; int total_leds; }; @@ -34,33 +38,37 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) if( !d->lights_file ) { - const char * shm_lights = GetParameterS( "shm_lights", 0 ); - //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. - - if( shm_lights ) + const char * shmname = GetParameterS( "shm_lights", 0 ); + if( shmname ) { - d->lights_file = shm_open(shm_lights, O_CREAT | O_RDWR, 0644); + d->lights_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); ftruncate( d->lights_file, 16384 ); d->lights_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->lights_file, 0); } - - printf( "Got SHM: %s->%d [%p]\n", shm_lights, d->lights_file, d->lights_ptr ); } if( !d->dft_file ) { const char * shmname = GetParameterS( "shm_dft", 0 ); - //const char * shm_dft = GetParameterS( "shm_dft", 0 ); // Not available. - if( shmname ) { d->dft_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); ftruncate( d->dft_file, 16384 ); d->dft_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->dft_file, 0); } + } - printf( "Got SHM: %s->%d [%p]\n", shmname, d->dft_file, d->dft_ptr ); + + if( !d->notes_file ) + { + const char * shmname = GetParameterS( "shm_notes", 0 ); + if( shmname ) + { + d->notes_file = shm_open(shmname, O_CREAT | O_RDWR, 0644); + ftruncate( d->notes_file, 16384 ); + d->notes_ptr = mmap(0,16384, PROT_READ | PROT_WRITE, MAP_SHARED, d->notes_file, 0); + } } @@ -81,6 +89,13 @@ static void SHMUpdate(void * id, struct NoteFinder*nf) memcpy( d->lights_ptr + 4, OutLEDs, d->total_leds*3 ); } + + if( d->notes_ptr ) + { + memcpy( d->notes_ptr, &nf->dists_count, 4 ); + memcpy( d->notes_ptr+4, nf->dists, sizeof( nf->dists[0] ) * nf->dists_count ); + } + } static void SHMParams(void * id ) diff --git a/colorchord2/shmtest.conf b/colorchord2/shmtest.conf index fe205d2..a6dc6ed 100644 --- a/colorchord2/shmtest.conf +++ b/colorchord2/shmtest.conf @@ -34,6 +34,7 @@ outdrivers = OutputCells, DisplaySHM shm_lights = /cclights shm_dft = /ccdft +shm_notes = /ccnotes lightx = 20 lighty = 4