Newsgroup: it.comp.lang.visual-basic
Titolo: API per leggere un CD-Audio

Ciao a tutti,
    ho bisogno di includere in un programma VB alcune routines che mi
estraggano da un CD Audio le seguenti informazioni:
1) Codice identificativo del CD (quello tra [] in cdplayer.ini)
2) la durata (in qualsiasi formato) delle singole tracce.
Mi hanno detto che esistono alcune funzioni API adatte allo scopo. Qualcuno
puņ aiutarmi ?
Grazie, Marcello

2) la durata (in qualsiasi formato) delle singole tracce.
Questo non ricordo, sorry... magari sul SC trovi qc...
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.morenosoft.com/MSVBSite/
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

Per la durata usa il Multimedia Control.
mmcontrol1.devicetype="CDAudio"
'identifica un cd audio
mmcontrol1.command="Open"
'apre il cd
tracce=mmcontrol1.tracks
'assegna alla variabile tracce il numero delle tracce audio presenti sul cd
mmcontrol1.track=1
'posiziona il lettore sulla prima traccia(ma non la suona)
lungh=mmcontrol1.tracklenght
'assegna a lungh la lunghezza della traccia 1 ma ancora non sono riuscito ad
estrapolare la lunghezza in h.m.s dal numero che ti restituisce
lunghcd=mmcontrol1.lenght
'assegna a lunghcd la durata del cd
mmcontrol1.command="Play"
'suona la traccia
Ciao.

 estrapolare la lunghezza in h.m.s dal numero che ti restituisce
Il valore restituito da .TrackLength è la conversione in formato Long
derivato dalla "somma" di 4 byte, i quali rappresentano delle misure
che variano in base all'impostazione della proprietà .TimeFormat.
Es:
Ammettendo di aver impostato .TimeFormat = mciFormatHms,
se una traccia ha una durata di 5 min. e 40 sec., la rappresentazione
in byte è:
&H0 ore;   &H05 min.;    &H28 sec.;    (non usato)
Se "incolliamo" i byte uno all'altro  (considerando che il byte
relativo alle ore è il "meno significativo", ossia sta a destra
della rappresentazione) otteniamo &HXX280500, dove XX è
il valore attribuito al 4° byte, che non è rilevante - perché non
rientra nella valutazione del tempo - però ha un valore. Supponiamo
che questo valore sia 17 (ha un significato, ma qui conta poco).
Il numero esadecimale composto sarà &H17280500.
Quindi, se una traccia ha durata 5'40", il valore restituito da
.TrackLength *dovrebbe essere* Val(&H17280500).
Invece no. In questo caso .TrackLength = Val(&H172805).
Il 1° byte, che ha valore nullo, non viene rappresentato (anche
perché il valore long stesso non potrebbe essere rappresentato).
Date queste idiosincrasie nella rappresentazione numerica,
si preferisce spesso dialogare direttamente con il sotto-sistema MCI
per la valutazione del tempo/traccia - tempo/registrazione.
Ti sottopongo alcuni metodi alternativi al controllo multimediale.
Public Declare Function mciSendString Lib "winmm.dll" _
        Alias "mciSendStringA" _
        (ByVal lpstrCommand As String, _
        ByVal lpstrReturnString As String, _
        ByVal uReturnLength As Long, _
        ByVal hwndCallback As Long) As Long
'Apertura della periferica
    'Corrisponde a MMControl1.Command = "open"
    mciSendString "open cdaudio alias cd wait shareable", 0, 0, 0
'Formato del tempo in TMSF
    'Corrisponde a MMControl1.TimeFormat = mciFormatTmsf
    mciSendString "set cd time format tmsf wait", 0, 0, 0
'Formato del tempo in millisecondi
    'Corrisponde a MMControl1.TimeFormat = mciFormatMilliseconds
    mciSendString "set cd time format milliseconds", 0, 0, 0
'Verifica della presenza del cd
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd media present", tmpBuff, Len(tmpBuff), 0
    'tmpBuff contiene la risposta al ritorno
'Verifica se la periferica è in Play
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd mode", tmpBuff, Len(tmpBuff), 0
    If Mid$(tmpBuff, 1, 7) = "playing" Then
        'Lo è
    End If
'Numero di tracce
'Corrisponde a [Tracce] = MMControl1.Tracks
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd number of tracks wait", tmpBuff, Len(tmpBuff), 0
    [Tracce] = CInt(Mid$(tmpBuff, 1, 2))
'Tempo di registrazione del cd (complessivo)
'Restituisce un valore formattato in "ore:min:sec"
'Corrisponderebbe a [RegCd] = MMControl1.Lenght
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd length wait", tmpBuff, Len(tmpBuff), 0
    [Length] = tmpBuff
'Durata della traccia
'Restituisce un valore formattato in "min:sec:ms"
'Corrisponderebbe a [TrackLength] = MMControl1.TrackLength
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd length track " & [NumTraccia], _
                            tmpBuff, Len(tmpBuff), 0
    [TrackLength] = tmpBuff
'Posizione attuale della testina di lettura del Cd
Dim tmpBuff As String
    tmpBuff = Space(30)
    mciSendString "status cd position", tmpBuff, Len(tmpBuff), 0
    [Traccia] = CInt(Mid$(tmpBuff, 1, 2))
    [Min.] = CInt(Mid$(tmpBuff, 4, 2))
    [Sec.] = CInt(Mid$(tmpBuff, 7, 2))
'Vai alla traccia [Traccia]%
    mciSendString "seek cd to " & Format$([Traccia]), 0, 0, 0
'Vai indietro o indietro di [Num_Ms] millisecondi
Dim tmpBuff As String
    tmpBuff = Space(30)
    [Tempo in millisecondi]
    mciSendString "status cd position wait", tmpBuff, Len(tmpBuff), 0
    [Controlla se il Cd è in "play"]
    [Se è in "play"]
        mciSendString "play cd from " & _
                        CStr(CLng(tmpBuff) [+/-] [Num_Ms]), 0, 0, 0
    [Altrimenti]
        mciSendString "seek cd to " & _
                        CStr(CLng(tmpBuff) [+/-] [Num_Ms]), 0, 0, 0
    [Tempo in tmsf]
'Start
    mciSendString "play cd", 0, 0, 0
'Stop
    mciSendString "stop cd wait", 0, 0, 0
'Pause
    mciSendString "pause cd", 0, 0, 0
'Chiudi tutto
    mciSendString "close all", 0, 0, 0