Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить информацию о дорожке аудио-CD?

Delphi , Файловая система , CD-ROM

Как получить информацию о дорожке аудио-CD?

Code:

unit frmMain;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MMSystem;
 
type
TForm1 = class(TForm)
   Memo1: TMemo;
   Button2: TButton;
   Button3: TButton;
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
private
   function IsAudioCD(Drive: char): bool;
public
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
function TForm1.IsAudioCD(Drive: char): bool;
var
DrivePath: string;
MaximumComponentLength: DWORD;
FileSystemFlags: DWORD;
VolumeName: string;
begin
Result := false;
DrivePath := Drive + ':\';
if GetDriveType(PChar(DrivePath)) = DRIVE_CDROM then
begin
   SetLength(VolumeName, 64);
   GetVolumeInformation(PChar(DrivePath), PChar(VolumeName), Length(VolumeName), nil,
     MaximumComponentLength, FileSystemFlags, nil, 0);
   if lStrCmp(PChar(VolumeName), 'Audio CD') = 0 then
     Result := True;
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
if IsAudioCD(' D ') then
   showmessage('Cd is an audio cd')
else
   showmessage('Cd is not an audio cd');
end;
 
procedure TForm1.Button3Click(Sender: TObject);
type
TDWord = record
   High: Word;
   Low: Word;
end;
var
msp: TMCI_INFO_PARMS;
MediaString: array[0..255] of char;
ret: longint;
I: integer;
StatusParms: TMCI_STATUS_PARMS;
MciSetParms: TMCI_SET_PARMS;
MciOpenParms: TMCI_OPEN_PARMS;
aDeviceID: MCIDEVICEID;
 
function GetTheDeviceID: MCIDEVICEID;
begin
   FillChar(MciOpenParms, SizeOf(MciOpenParms), #0);
   try
     MciOpenParms.lpstrDeviceType := 'cdaudio';
     ret := mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE + MCI_OPEN_SHAREABLE,
       LongInt(@MciOpenParms));
     Result := MciOpenParms.wDeviceID;
   except
     on E: Exception do
     begin
       Result := 0;
       showmessage('error receiving deviceIDt' + #13 + SysErrorMessage(GetLastError)
         + #13 + E.Message);
     end;
   end;
end;
 
function GetTrackInfo(const uMsg: UInt; const fdwCommand: DWord;
   const dwItem: DWord; const dwTrack: DWord): string;
begin
   Result := 'Did not work...';
   FillChar(MediaString, SizeOf(MediaString), #0);
   FillChar(StatusParms, SizeOf(StatusParms), #0);
   StatusParms.dwItem := dwItem;
   StatusParms.dwTrack := dwTrack;
   ret := mciSendCommand(aDeviceID, uMsg, fdwCommand, longint(@StatusParms));
   if Ret = 0 then
     Result := IntToStr(StatusParms.dwReturn);
end;
 
procedure SetTimeInfo;
begin
   FillChar(MciSetParms, SizeOf(MciSetParms), #0);
   MciSetParms.dwTimeFormat := MCI_FORMAT_MSF;
   ret := mciSendCommand(aDeviceID {Mp.DeviceId}, MCI_SET, MCI_SET_TIME_FORMAT,
     longint(@MciSetParms));
   if Ret <> 0 then
     Showmessage('Error convering timeformat...');
end;
 
begin
Memo1.Clear;
aDeviceID := GetTheDeviceID;
Application.ProcessMessages;
Memo1.Lines.Add('Track info  :');
SetTimeInfo;
Memo1.Lines.Add('Tracks: ' + GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM,
   MCI_STATUS_NUMBER_OF_TRACKS, 0));
Memo1.Lines.Add(' ');
for I := 1 to StrToInt(GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM,
   MCI_STATUS_NUMBER_OF_TRACKS, 0)) do
begin
   Memo1.Lines.Add('Track ' + IntToStr(I) + '  :  ' + IntToStr(MCI_MSF_MINUTE
     (StrToInt(GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM +
     MCI_TRACK, MCI_STATUS_LENGTH, I)))) + ':' +
     IntToStr(MCI_MSF_SECOND(StrToInt(GetTrackInfo(MCI_STATUS,
     MCI_STATUS_ITEM + MCI_TRACK, MCI_STATUS_LENGTH, I)))));
end;
Application.ProcessMessages;
end;
 
end.

Перевод контента на русский язык:

Код - это приложение Delphi, которое стремится получить информацию о звуковом устройстве CD и отобразить ее в поле заметок на форме.

Вот как можно получить информацию:

  1. Определите устройство: В этом случае код проверяет, является ли устройство 'D:' аудио-CD устройством с помощью функции IsAudioCD.
  2. Откройте Device ID: Device ID аудио-CD игрока получается вызовом функции GetTheDeviceID.
  3. Получите информацию о треке: Используя команды MCI (Медиа-контрольный интерфейс), можно получить информацию о треках на аудио-CD. Функция GetTrackInfo отправляет команды MCI для получения информации о треках, таких как количество треков, длина в минутах и секундах и т.д.
  4. Установите формат времени: До получения какой-либо информации от аудио-CD игрока необходимо установить формат времени с помощью процедуры SetTimeInfo.
  5. Получите информацию о треке: Код получает информацию о треке и отображает ее в поле заметок на форме.

Однако, есть некоторые проблемы с этим кодом:

  • Функция GetTheDeviceID не обрабатывает исключения правильно.
  • Ошибочные сообщения, отображаемые пользователю, могут быть более информативными.
  • Нет обработки ошибок для случаев, когда устройство не является аудио-CD или когда команды MCI не выполняются.

Вот измененная версия кода с улучшенной обработкой ошибок и лучше форматированными сообщениями об ошибках:

function TForm1.GetTheDeviceID: MCIDEVICEID;
begin
  FillChar(MciOpenParms, SizeOf(MciOpenParms), #0);
  try
    MciOpenParms.lpstrDeviceType := 'cdaudio';
    Result := mciSendCommand(0, MCI_OPEN, MCI_OPEN_TYPE + MCI_OPEN_SHAREABLE,
      LongInt(@MciOpenParms));
    if Result <> 0 then
      raise Exception.Create('Error receiving deviceID: ' + SysErrorMessage(GetLastError));
    Result := MciOpenParms.wDeviceID;
  except
    on E: Exception do
      begin
        Result := 0;
        ShowMessage('Error receiving device ID: ' + E.Message);
      end;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  aDeviceID: MCIDEVICEID;
begin
  try
    aDeviceID := GetTheDeviceID;
    Memo1.Lines.Add('Track info:');
    SetTimeInfo(aDeviceID);
    Memo1.Lines.Add('Tracks: ' + GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM,
      MCI_STATUS_NUMBER_OF_TRACKS, 0));
    Memo1.Lines.Add('');
    for I := 1 to StrToInt(GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM,
      MCI_STATUS_NUMBER_OF_TRACKS, 0)) do
    begin
      Memo1.Lines.Add('Track ' + IntToStr(I) + ': ' +
        IntToStr(MCI_MSF_MINUTE(StrToInt(GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM +
          MCI_TRACK, MCI_STATUS_LENGTH, I)))) + ':' +
        IntToStr(MCI_MSF_SECOND(StrToInt(GetTrackInfo(MCI_STATUS, MCI_STATUS_ITEM +
          MCI_TRACK, MCI_STATUS_LENGTH, I)))));
    end;
  except
    on E: Exception do
      begin
        ShowMessage('Error displaying track information: ' + E.Message);
      end;
  end;
end;

Измененная версия кода обрабатывает исключения правильно и отображает более информативные сообщения об ошибках для пользователя.

Как получить информацию о дорожке аудио-CD: с помощью программирования на языке Delphi можно считать количество треков, длительность каждого трека и другие параметры аудио-CD.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: CD-ROM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:44:28/0.014945983886719/1