LOCAL mixer As TMixer, mixerline As TMixerLine mixer = CREATEOBJECT("TMixer") IF mixer.errorno = 0 ? mixer.fullname FOR nIndex=0 TO mixer.destinations-1 mixerline = mixer.GetMixerLine(nIndex) ? mixerline.fullname NEXT ENDIF * end of main DEFINE CLASS TMixer As Session #DEFINE MMSYSERR_NOERROR 0 #DEFINE MIXER_SHORT_NAME_CHARS 16 #DEFINE MIXER_LONG_NAME_CHARS 64 #DEFINE MAXPNAMELEN 32 #DEFINE MIXERCAPS_SIZE 48 PROTECTED hmixer errorno=0 manufacturerid=0 productid=0 driverversion=0 fullname="" destinations=0 PROCEDURE Init THIS.declare THIS.MixOpen PROTECTED PROCEDURE MixOpen * retrieves values from MIXERCAPS structure LOCAL hMixer, cMIXERCAPS hMixer=0 THIS.errorno = mixerOpen(@m.hMixer, 0,0,0,0) THIS.hmixer = m.hMixer IF THIS.errorno = MMSYSERR_NOERROR cMIXERCAPS = REPLICATE(CHR(0), MIXERCAPS_SIZE) THIS.errorno = mixerGetDevCaps(THIS.hmixer,; @cMIXERCAPS, MIXERCAPS_SIZE) IF THIS.errorno = MMSYSERR_NOERROR THIS.manufacturerid = buf2word(SUBSTR(cMIXERCAPS, 1,2)) THIS.productid = buf2word(SUBSTR(cMIXERCAPS, 3,2)) THIS.driverversion = buf2word(SUBSTR(cMIXERCAPS, 5,2)) THIS.fullname = SUBSTR(cMIXERCAPS, 9,MAXPNAMELEN) THIS.fullname = SUBSTR(THIS.fullname, 1,; AT(CHR(0),THIS.fullname)-1) THIS.destinations = buf2dword(SUBSTR(cMIXERCAPS, 45,4)) ENDIF ENDIF FUNCTION GetMixerLine(nIndex) As TMixerLine LOCAL oMixerLine oMixerLine = CREATEOBJECT("TMixerLine",; THIS.hmixer, nIndex) THIS.errorno = oMixerLine.errorno RETURN m.oMixerLine PROCEDURE Destroy THIS.MixClose PROTECTED PROCEDURE MixClose IF THIS.hmixer <> 0 = mixerClose(THIS.hmixer) THIS.hmixer=0 ENDIF PROCEDURE declare DECLARE INTEGER mixerGetDevCaps IN winmm; INTEGER uMxId, STRING @pmxcaps, INTEGER cbmxcaps DECLARE INTEGER mixerOpen IN winmm; INTEGER @phmx, INTEGER uMxId, INTEGER dwCallback,; INTEGER dwInstance, INTEGER fdwOpen DECLARE INTEGER mixerClose IN winmm INTEGER hmx DECLARE INTEGER mixerGetLineInfo IN winmm; INTEGER hmxobj, STRING @pmxl, INTEGER fdwInfo ENDDEFINE DEFINE CLASS TMixerLine As Session * implements MIXERLINE structure errorno=0 destination=0 source=0 lineid=0 channels=0 shortname="" fullname="" PROCEDURE Init(hMixer, nDestination) #DEFINE MIXERLINE_SIZE 168 #DEFINE MIXER_GETLINEINFOF_DESTINATION 0 LOCAL cMIXERLINE cMIXERLINE = PADR(num2dword(MIXERLINE_SIZE) +; num2dword(nDestination), MIXERLINE_SIZE, CHR(0)) THIS.errorno = mixerGetLineInfo(hMixer,; @cMIXERLINE, MIXER_GETLINEINFOF_DESTINATION) IF THIS.errorno <> MMSYSERR_NOERROR RETURN ENDIF THIS.destination = nDestination THIS.source = buf2dword(SUBSTR(cMIXERLINE, 9,4)) THIS.lineid = buf2dword(SUBSTR(cMIXERLINE, 13,4)) THIS.channels = buf2dword(SUBSTR(cMIXERLINE, 29,4)) THIS.shortname = SUBSTR(cMIXERLINE, 41,; MIXER_SHORT_NAME_CHARS) THIS.shortname = SUBSTR(THIS.shortname, 1,; AT(CHR(0),THIS.shortname)-1) THIS.fullname = SUBSTR(cMIXERLINE, 57,; MIXER_LONG_NAME_CHARS) THIS.fullname = SUBSTR(THIS.fullname, 1,; AT(CHR(0),THIS.fullname)-1) ENDDEFINE ********** static routines ************ FUNCTION buf2dword(lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24) FUNCTION buf2word(lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; Asc(SUBSTR(lcBuffer, 2,1)) * 256 FUNCTION num2dword(lnValue) #DEFINE m0 256 #DEFINE m1 65536 #DEFINE m2 16777216 IF lnValue < 0 lnValue = 0x100000000 + lnValue ENDIF LOCAL b0, b1, b2, b3 b3 = Int(lnValue/m2) b2 = Int((lnValue - b3*m2)/m1) b1 = Int((lnValue - b3*m2 - b2*m1)/m0) b0 = Mod(lnValue, m0) RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)