PDA

Ver la Versión Completa : Saber el UPC de un CD de audio


MON___
06-05-2007, 00:38:40
Tengo dos unidades de CD ROM (D - E), que muestro en un comboBox. Introduzco un CD Audio en una de ellas (supongamos que lo he introducido en E) y la selecciono en el Combo para (pulsando un botón) obtener el UPC ("UNIVERSAL PRUDUCT CODE") del disco. Para ello he creado la siguiente rutina


function obtenerUPC : string;
var
buffer : array[0...MAX_PATH] of char;
begin
mciSendString('open cdaudio', nil, 0, 0);
mciSendString('info cdaudio upc', buffer, sizeof(buffer), 0);
result := StrPas(buffer);
end;


La duda que tengo: ¿qué me falta en esa función para indicar que me debe dar el UPC del disco introducido en E y no en D?

cHackAll
07-05-2007, 18:57:59
Hace un par de años hice un CDEject, que expulsaba el CD con el sistema MCI, lo malo de ésto es que solo me funcionaba con una única unidad, la que el Güindos reconocia como unidad de Audio.. la otra no la tomaba en cuenta y nunca llegue a expulsarla hasta que utilice otra tecnología. Explicame un poco mas de el UPC, me parece que se puede obtener el dato con lectura absoluta.

Suerte.

MON___
07-05-2007, 21:49:43
Hace un par de años hice un CDEject, que expulsaba el CD con el sistema MCI, lo malo de ésto es que solo me funcionaba con una única unidad, la que el Güindos reconocia como unidad de Audio.. la otra no la tomaba en cuenta y nunca llegue a expulsarla hasta que utilice otra tecnología. Explicame un poco mas de el UPC, me parece que se puede obtener el dato con lectura absoluta.

Suerte.

El UPC o "Universal Product Code", como indica su nombre, es un código (numérico) que llevan los CD de AUDIO . ¿Para qué sirve? Por ejemplo, hay reproductores (el WINAMP y muchos otros) que leyendo ese código lo envian a una base de datos para obtener los títulos de los "tracks" u otros datos del disco.

cHackAll
07-05-2007, 22:33:03
No me refiero a eso, hago una busqueda, define, etc. y se que es... pero quisiera especificamente un ejemplo.

Y la segunda duda que tengo es: Tengo entendido que tienes dos unidades D y E... tu funcion te retorna de las dos unidades? osea pones un CD de audio original en la D, usas tu funcion y te retorna XXxXxX... la pones en la E y tambien te retorna lo mismo?

Tengo entendido que no todos los CDs lo leen, hice la prueba tu código en mi PC y en 2+ y no me retorna nada!

cHackAll
07-05-2007, 23:51:36
Tengo entendido que no solo tendrás problemas pues no todos las lectoras leen la UPC, si no que no todos los CDs de audio tienen dicho código; te aconsejo usar "Identity", que (si no me equivovo) retorna solo la serie del disco pero en teoría es unica.

Lo que necesitas para UPC es:

uses MMSystem;

var
Buffer: array [0..31] of Char;
Open: TMCI_Open_Parms = (lpstrDeviceType: 'CDAudio');
Info: TMCI_Info_Parms = (lpstrReturn: @Buffer; dwRetSize: SizeOf(Buffer));

function GetUPC(Drive: Char): string;
begin
Result := '';
Open.lpstrElementName := PChar(string(Drive + ':'));
if mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, Longint(@Open)) <> 0 then Exit;
mciSendCommand(Open.wDeviceID, MCI_INFO, MCI_INFO_MEDIA_UPC, Longint(@Info));
mciSendCommand(Open.wDeviceID, MCI_CLOSE, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, Longint(@Open));
Result := Buffer;
end;

Por si te sirva te dejo http://msdn2.microsoft.com/en-us/library/ms712580.aspx (http://msdn2.microsoft.com/en-us/library/ms712580.aspx)

PD: No se si se puede con cadenas MCI, pero si te gusta revisa http://msdn2.microsoft.com/en-us/library/ms712587.aspx (http://msdn2.microsoft.com/en-us/library/ms712587.aspx)

Suerte!

MaMu
12-04-2008, 00:10:39
Tengo entendido que no solo tendrás problemas pues no todos las lectoras leen la UPC, si no que no todos los CDs de audio tienen dicho código; te aconsejo usar "Identity", que (si no me equivovo) retorna solo la serie del disco pero en teoría es unica.

Lo que necesitas para UPC es:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)uses MMSystem;

var
Buffer: array [0..31] of Char;
Open: TMCI_Open_Parms = (lpstrDeviceType: 'CDAudio');
Info: TMCI_Info_Parms = (lpstrReturn: @Buffer; dwRetSize: SizeOf(Buffer));

function GetUPC(Drive: Char): string;
begin
Result := '';
Open.lpstrElementName := PChar(string(Drive + ':'));
if mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, Longint(@Open)) <> 0 then Exit;
mciSendCommand(Open.wDeviceID, MCI_INFO, MCI_INFO_MEDIA_UPC, Longint(@Info));
mciSendCommand(Open.wDeviceID, MCI_CLOSE, MCI_OPEN_TYPE or MCI_OPEN_ELEMENT, Longint(@Open));
Result := Buffer;
end;




Por si te sirva te dejo http://msdn2.microsoft.com/en-us/library/ms712580.aspx (http://msdn2.microsoft.com/en-us/library/ms712580.aspx)

PD: No se si se puede con cadenas MCI, pero si te gusta revisa http://msdn2.microsoft.com/en-us/library/ms712587.aspx (http://msdn2.microsoft.com/en-us/library/ms712587.aspx)

Suerte!

Lo he probado pero no me funciona.

MaMu
12-04-2008, 00:13:25
Voy a pecar de ignorante en el tema audio, pero no es lo mismo hacer:


function GetVolumeID(DriveChar: Char): String;
var
MaxFileNameLength, VolFlags, SerNum: DWord;
begin
if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
@SerNum, MaxFileNameLength, VolFlags, nil, 0)
then
begin
Result := IntToHex(SerNum,8);
end
else
Result := '';
end;


Saludos

cHackAll
14-04-2008, 03:46:56
Lo he probado pero no me funciona.

...no solo tendrás problemas pues no todos las lectoras leen la UPC, si no que no todos los CDs de audio tienen dicho código
...
Voy a pecar de ignorante en el tema audio, pero no es lo mismo hacer: [codigo]

...te aconsejo usar "Identity", que (si no me equivovo) retorna solo la serie del disco pero en teoría es unica.

Saludos