Je programme actuellement un lecteur karaoké. Une fois développée, mon application devrait être capable de contrôler le volume sonore d'un lecteur de cd : dvd. Et si vous insérez un cd / dvd karaoké, l'application sera capable d'afficher grâce au format "cdtext", les paroles des chansons... Pour ce faire, j'utilise "deviceiocontrol".
Je vous fais part, ici, d'un code permettant de retrouver les valeurs du paramètre "dwiocontrolcode" de cette fonction.
Code : Tout sélectionner
; devioctl.pbi
; ce module permet d'obtenir facilement la valeur du paramètre "dwiocontrolcode"
; de la fonction "deviceiocontrol_"
; déclaration des différents types de périphériques
#FILE_DEVICE_BEEP = $00000001
#FILE_DEVICE_CD_ROM = $00000002
#FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003
#FILE_DEVICE_CONTROLLER = $00000004
#FILE_DEVICE_DATALINK = $00000005
#FILE_DEVICE_DFS = $00000006
#FILE_DEVICE_DISK = $00000007
#FILE_DEVICE_DISK_FILE_SYSTEM = $00000008
#FILE_DEVICE_FILE_SYSTEM = $00000009
#FILE_DEVICE_INPORT_PORT = $0000000a
#FILE_DEVICE_KEYBOARD = $0000000b
#FILE_DEVICE_MAILSLOT = $0000000c
#FILE_DEVICE_MIDI_IN = $0000000d
#FILE_DEVICE_MIDI_OUT = $0000000e
#FILE_DEVICE_MOUSE = $0000000f
#FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010
#FILE_DEVICE_NAMED_PIPE = $00000011
#FILE_DEVICE_NETWORK = $00000012
#FILE_DEVICE_NETWORK_BROWSER = $00000013
#FILE_DEVICE_NETWORK_FILE_SYSTEM = $00000014
#FILE_DEVICE_NULL = $00000015
#FILE_DEVICE_PARALLEL_PORT = $00000016
#FILE_DEVICE_PHYSICAL_NETCARD = $00000017
#FILE_DEVICE_PRINTER = $00000018
#FILE_DEVICE_SCANNER = $00000019
#FILE_DEVICE_SERIAL_MOUSE_PORT = $0000001a
#FILE_DEVICE_SERIAL_PORT = $0000001b
#FILE_DEVICE_SCREEN = $0000001c
#FILE_DEVICE_SOUND = $0000001d
#FILE_DEVICE_STREAMS = $0000001e
#FILE_DEVICE_TAPE = $0000001f
#FILE_DEVICE_TAPE_FILE_SYSTEM = $00000020
#FILE_DEVICE_TRANSPORT = $00000021
#FILE_DEVICE_UNKNOWN = $00000022
#FILE_DEVICE_VIDEO = $00000023
#FILE_DEVICE_VIRTUAL_DISK = $00000024
#FILE_DEVICE_WAVE_IN = $00000025
#FILE_DEVICE_WAVE_OUT = $00000026
#FILE_DEVICE_8042_PORT = $00000027
#FILE_DEVICE_NETWORK_REDIRECTOR = $00000028
#FILE_DEVICE_BATTERY = $00000029
#FILE_DEVICE_BUS_EXTENDER = $0000002a
#FILE_DEVICE_MODEM = $0000002b
#FILE_DEVICE_VDM = $0000002c
#FILE_DEVICE_MASS_STORAGE = $0000002d
#FILE_DEVICE_SMB = $0000002e
#FILE_DEVICE_KS = $0000002f
#FILE_DEVICE_CHANGER = $00000030
#FILE_DEVICE_SMARTCARD = $00000031
#FILE_DEVICE_ACPI = $00000032
#FILE_DEVICE_DVD = $00000033
#FILE_DEVICE_FULLSCREEN_VIDEO = $00000034
#FILE_DEVICE_DFS_FILE_SYSTEM = $00000035
#FILE_DEVICE_DFS_VOLUME = $00000036
#FILE_DEVICE_SERENUM = $00000037
#FILE_DEVICE_TERMSRV = $00000038
#FILE_DEVICE_KSEC = $00000039
#FILE_DEVICE_FIPS = $0000003A
; définition des différentes méthodes d'accès au périphérique
#METHOD_BUFFERED = 0 ; utilisation d'une mémoire tampon
; pour transmettre LES paramètres entre système et périphérique
#METHOD_IN_DIRECT = 1 ; les paramètres sont transmis directement par le périphérique
#METHOD_OUT_DIRECT = 2 ; les données sont transmises au système
; sans mémoire tampon
#METHOD_NEITHER = 3
; définition des différents modes d'accès
#FILE_ANY_ACCESS = 0
#FILE_SPECIAL_ACCESS = #FILE_ANY_ACCESS
#FILE_READ_ACCESS = $0001 ; file & pipe
#FILE_WRITE_ACCESS = $0002 ;file & pipe
Procedure CTL_CODE(DeviceType, Function, Method, Access)
; procédure permettant de trouver la valeur du "dwiocontrolcode"
; paramètre d'entrée :
; - le type de périphérique
; - la fonction que vous désirez lui envoyer
; - la méthode d'accès
; - le type d'accès "lecture seule..."
; paramètre de sortie :
; - la procédure renvoie une valeur de type "long"
ProcedureReturn ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
EndProcedure
; la suite de ce module est spécialisée dans la manipulation des lecteurs de cds / dvds
; et en particulier est utile pour lire des données sur les cds audios
#IOCTL_CDROM_BASE = #FILE_DEVICE_CD_ROM
Global IOCTL_CDROM_UNLOAD_DRIVER = CTL_CODE(#IOCTL_CDROM_BASE, $00402,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_READ_TOC = CTL_CODE(#IOCTL_CDROM_BASE,$0000,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_SEEK_AUDIO_MSF = CTL_CODE(#IOCTL_CDROM_BASE,$0001,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_STOP_AUDIO = CTL_CODE(#IOCTL_CDROM_BASE,$0002,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_PAUSE_AUDIO = CTL_CODE(#IOCTL_CDROM_BASE,$0003,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_RESUME_AUDIO = CTL_CODE(#IOCTL_CDROM_BASE,$0004,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_GET_VOLUME = CTL_CODE(#IOCTL_CDROM_BASE,$0005,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_PLAY_AUDIO_MSF = CTL_CODE(#IOCTL_CDROM_BASE,$0006,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_SET_VOLUME = CTL_CODE(#IOCTL_CDROM_BASE,$000A,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_READ_Q_CHANNEL = CTL_CODE(#IOCTL_CDROM_BASE,$000B,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_GET_CONTROL = CTL_CODE(#IOCTL_CDROM_BASE,$000D,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_GET_LAST_SESSION = CTL_CODE(#IOCTL_CDROM_BASE,$000E,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_RAW_READ = CTL_CODE(#IOCTL_CDROM_BASE,$000F,#METHOD_OUT_DIRECT,#FILE_READ_ACCESS)
Global IOCTL_CDROM_DISK_TYPE = CTL_CODE(#IOCTL_CDROM_BASE,$0010,#METHOD_BUFFERED,#FILE_ANY_ACCESS)
Global IOCTL_CDROM_GET_DRIVE_GEOMETRY = CTL_CODE(#IOCTL_CDROM_BASE,$0013,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_GET_DRIVE_GEOMETRY_EX = CTL_CODE(#IOCTL_CDROM_BASE,$0014,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_READ_TOC_EX = CTL_CODE(#IOCTL_CDROM_BASE,$0015,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_GET_CONFIGURATION = CTL_CODE(#IOCTL_CDROM_BASE,$0016,#METHOD_BUFFERED,#FILE_READ_ACCESS)
; The following device control codes are common For all class drivers. The
; functions codes defined here must match all of the other class drivers.
; Warning: these codes will be replaced IN the future With the IOCTL_STORAGE
; codes included below
Global IOCTL_CDROM_CHECK_VERIFY = CTL_CODE(#IOCTL_CDROM_BASE,$0200,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_MEDIA_REMOVAL = CTL_CODE(#IOCTL_CDROM_BASE,$0201,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_EJECT_MEDIA = CTL_CODE(#IOCTL_CDROM_BASE,$0202,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_LOAD_MEDIA = CTL_CODE(#IOCTL_CDROM_BASE,$0203,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_RESERVE = CTL_CODE(#IOCTL_CDROM_BASE,$0204,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_RELEASE = CTL_CODE(#IOCTL_CDROM_BASE,$0205,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_FIND_NEW_DEVICES = CTL_CODE(#IOCTL_CDROM_BASE,$0206,#METHOD_BUFFERED,#FILE_READ_ACCESS)
Global IOCTL_CDROM_SIMBAD = CTL_CODE(#IOCTL_CDROM_BASE,$1003,#METHOD_BUFFERED,#FILE_READ_ACCESS)
#MAXIMUM_NUMBER_TRACKS = 100 ; 1 cd audio ne peut contenir que 100 plages
#MAXIMUM_CDROM_SIZE = 804
; les structures suivantes décrivent les différents éléments présents sur un cd audio
Structure CDROM_READ_TOC_EX
Format.b[4]
reserved1.b[3] ;future expansion
Msf.b[1]
SessionTrack.b
Reserved2.b ;future expansion
Reserved3.b ; future expansion
EndStructure
#FORMAT_TOC = 0
#FORMAT_SESSION = 1
#FORMAT_FULL_TOC = 2
#FORMAT_PMA = 3
#FORMAT_ATIP = 4
#FORMAT_CDTEXT = 5
; CD ROM Table OF Contents (TOC)
; Format 0 - Get table of contents
Structure TRACK_DATA
Reserved.c
Control.c[4]
Adr.c[4]
TrackNumber.c
Reserved1.c
Address.c[4]
EndStructure
Structure CDROM_TOC
Length.b[2] ;add two bytes for this field
FirstTrack.b
LastTrack.b
TRACK_DATA.Track_Data[100]
EndStructure
Structure CDROM_TOC_SESSION_DATA
Length.b[2] ; add two bytes for this field
FirstCompleteSession.b
LastCompleteSession.b
TRACK_DATA.Track_Data[1]
EndStructure
; CD ROM Table OF Contents
; Format 2 - Full TOC
Structure CDROM_TOC_FULL_TOC_DATA_BLOCK
SessionNumber.b
Control.b[4]
Adr.b[4]
Reserved1.b
Point.b
MsfExtra.b[3]
Zero.b
Msf.b[3]
EndStructure
Structure CDROM_TOC_FULL_TOC_DATA
Length.b[2] ;add two bytes for this field
FirstCompleteSession.b
LastCompleteSession.b
EndStructure
; Format 3 - Program Memory Area
Structure CDROM_TOC_PMA_DATA
Length.b [2] ;add two bytes for this field
Reserved1.b
Reserved2.b
;CDROM_TOC_FULL_TOC_DATA_BLOCK Descriptors[0]
EndStructure
; Format 4 - Absolute Time IN Pregroove
Structure CDROM_TOC_ATIP_DATA_BLOCK
CdrwReferenceSpeed.b
Reserved3.b
WritePower.b
True1.b
Reserved4.b
UnrestrictedUse.b
Reserved5.b
A3Valid.b
A2Valid.b
A1Valid.b
DiscSubType.b
IsCdrw.b
True2.b
Reserved7.b
LeadInMsf.b[3]
Reserved8.b
LeadOutMsf.b[3]
Reserved9.b
A1Values.b[3]
Reserved10.b
A2Values.b[3]
Reserved11.b
A3Values.b[3]
Reserved12.b
EndStructure
Structure CDROM_TOC_ATIP_DATA
Text.b[12]
WText.b[6]
Length.b[2] ;ADD two bytes For this field
Reserved1.b
Reserved2.b
;CDROM_TOC_ATIP_DATA_BLOCK Descriptors[0]
EndStructure
; Format 5 - CD Text Info
Structure CDROM_TOC_CD_TEXT_DATA_BLOCK
PackType.b
TrackNumber.b
ExtensionFlag.b ;should be zero!
SequenceNumber.b
CharacterPosition.b
BlockNumber.b
Unicode.b
CRC.b[2]
EndStructure
Structure CDROM_TOC_CD_TEXT_DATA
Length.c[2] ; add two bytes for this field
Reserved1.c
Reserved2.c
EndStructure
; These are the types used For PackType field IN CDROM_TOC_CD_TEXT_DATA_BLOCK
; And also For requesting specific info from IOCTL_CDROM_READ_CD_TEXT
#CDROM_CD_TEXT_PACK_ALBUM_NAME = $80
#CDROM_CD_TEXT_PACK_PERFORMER = $81
#CDROM_CD_TEXT_PACK_SONGWRITER = $82
#CDROM_CD_TEXT_PACK_COMPOSER = $83
#CDROM_CD_TEXT_PACK_ARRANGER = $84
#CDROM_CD_TEXT_PACK_MESSAGES = $85
#CDROM_CD_TEXT_PACK_DISC_ID = $86
#CDROM_CD_TEXT_PACK_GENRE = $87
#CDROM_CD_TEXT_PACK_TOC_INFO = $88
#CDROM_CD_TEXT_PACK_TOC_INFO2 = $89
; 0x8a - 0x8d are reserved....
#CDROM_CD_TEXT_PACK_UPC_EAN = $8e
#CDROM_CD_TEXT_PACK_SIZE_INFO = $8f
; Play audio starting at MSF And ending at MSF
Structure CDROM_PLAY_AUDIO_MSF
StartingM.c
StartingS.c
StartingF.c
EndingM.c
EndingS.c
EndingF.c
EndStructure
; Seek To MSF
Structure CDROM_SEEK_AUDIO_MSF
M.c
S.c
F.c
EndStructure
; Flags For the disk type
Structure CDROM_DISK_DATA
DiskData.l
EndStructure
#CDROM_DISK_AUDIO_TRACK = $00000001
#CDROM_DISK_DATA_TRACK = $00000002
; CD ROM Data Mode Codes, used With IOCTL_CDROM_READ_Q_CHANNEL
#IOCTL_CDROM_SUB_Q_CHANNEL = 0
#IOCTL_CDROM_CURRENT_POSITION = $01
#IOCTL_CDROM_MEDIA_CATALOG = $02
#IOCTL_CDROM_TRACK_ISRC = $03
Structure CDROM_SUB_Q_DATA_FORMAT
Format.c
Track.c
EndStructure
; CD ROM SUB-Q Channel Data Format
Structure SUB_Q_HEADER
Reserved0.c
AudioStatus.c
DataLength.c[2]
EndStructure
Structure SUB_Q_CURRENT_POSITION Extends sub_q_header
FormatCode.c
Control.c
ADR.c
TrackNumber.c
IndexNumber.c
AbsoluteAddress.c[4]
TrackRelativeAddress.c[4]
EndStructure
Structure SUB_Q_MEDIA_CATALOG_NUMBER Extends SUB_Q_HEADER
FormatCode.c
Reserved.c[3]
Reserved1.c
Mcval.c
MediaCatalog.c[15]
EndStructure
Structure SUB_Q_TRACK_ISRC Extends SUB_Q_HEADER
FormatCode.c
Reserved.c
Track.c
Reserved1.c
Reserved2.c ; = 7
Tcval.c ;=1
TrackIsrc.c[15]
EndStructure
; Audio Status Codes
#AUDIO_STATUS_NOT_SUPPORTED = $00
#AUDIO_STATUS_IN_PROGRESS = $11
#AUDIO_STATUS_PAUSED = $12
#AUDIO_STATUS_PLAY_COMPLETE = $13
#AUDIO_STATUS_PLAY_ERROR = $14
#AUDIO_STATUS_NO_STATUS = $15
; ADR SUB-channel Q Field
#ADR_NO_MODE_INFORMATION = $00
#ADR_ENCODES_CURRENT_POSITION = $01
#ADR_ENCODES_MEDIA_CATALOG = $02
#ADR_ENCODES_ISRC = $03
; SUB-channel Q Control Bits
#AUDIO_WITH_PREEMPHASIS = $01
#DIGITAL_COPY_PERMITTED = $02
#AUDIO_DATA_TRACK = $04
#TWO_FOUR_CHANNEL_AUDIO = $08
; Get Audio control parameters
Structure CDROM_AUDIO_CONTROL
LbaFormat.c
LogicalBlocksPerSecond.w
EndStructure
; Volume control - Volume takes a value between 1 And $0FF.
; SCSI-II CDROM audio suppports up To 4 audio ports With
; Independent volume control.
Structure VOLUME_CONTROL
PortVolume.c[4]
EndStructure
#YellowMode2=0
#XAForm2=1
#CDDA=3
; Passed To cdrom To describe the raw Read, ie. Mode 2, Form 2, CDDA...
Structure RAW_READ_INFO
DiskOffset.q
SectorCount.l
TRACK_MODE_TYPE.c
EndStructure