1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303:
| unit pl;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus; type Tplaylist = record title: string; length: integer; datei: string; end; Type TID3Tag = record ID: string[3]; Titel: string[30]; Artist: string[30]; Album: string[30]; Year: string[4]; Comment: string[30]; Genre: byte; dauer: longint; sample: integer; bits: byte; vers: byte; layers: byte; end;
type TForm3 = class(TForm) playlist: TListBox; Add: TButton; Button1: TButton; Button2: TButton; MainMenu1: TMainMenu; Neu1: TMenuItem; Play1: TMenuItem; Playlist1: TMenuItem; Lschen1: TMenuItem; ffnen1: TMenuItem; Speichern1: TMenuItem; Suchennach1: TMenuItem; Artist1: TMenuItem; itle1: TMenuItem; Album1: TMenuItem; procedure itle1Click(Sender: TObject); procedure ffnen1Click(Sender: TObject); procedure Lschen1Click(Sender: TObject); procedure Play1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure playlistKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure AddClick(Sender: TObject); procedure playlistDblClick(Sender: TObject); private public end;
const MPEG_BIT_RATES : array[1..3] of array[1..3] of array[0..15] of word = (((0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0), (0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0), (0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0)), ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)), ((0,32,48, 56, 64, 80, 96,112,128,144,160,176,192,224,256,0), (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0), (0, 8,16,24, 32, 40, 48, 56, 64, 80, 96, 112,128,144,160,0)));
sample_rates: array[1..3] of array [0..3] of word= ((44100,48000,32000,0), (22050,24000,16000,0), (11025,12000,8000,0));
var Form3: TForm3; pos, noft, tpassd: Integer; list: array of Tplaylist; ID3Tag: TID3Tag; m3u: TStringlist; implementation
uses maplayer, suchen;
{$R *.dfm} procedure Lese_ID3Tag(Filename: string); var Buffer: array[1..128] of char; F: File; mp3hdrread: array[1..4] of byte; mp3hdr: longint absolute mp3hdrread; tempbyte, bitrateindex, versionindex: byte; bitrate, version, layer, groese: longint; begin AssignFile(F, Filename);
Reset(F,1); groese:=filesize(f); blockread(f,mp3hdrread,4); tempbyte:=mp3hdrread[1]; mp3hdrread[1]:=mp3hdrread[4]; mp3hdrread[4]:=tempbyte; tempbyte:=mp3hdrread[2]; mp3hdrread[2]:=mp3hdrread[3]; mp3hdrread[3]:=tempbyte;
reset(f,1); Seek(F,FileSize(F)-128); BlockRead(F, Buffer, SizeOf(Buffer)); CloseFile(F); bitrateindex:=((mp3hdr shr 12) and $F); versionindex:=((mp3hdr shr 19) and $3);
case versionindex of 0: version:=3; 1: version:=0; 2: version:=2; 3: version:=1; end;
layer:=4-((mp3hdr shr 17) and $3);
if version<>0 then bitrate:=MPEG_BIT_RATES[version][layer][bitrateindex] else bitrate:=128;
with ID3Tag do begin ID:=copy(Buffer,1,3); Titel:=copy(Buffer,4,30); Artist:=copy(Buffer,34,30); Album:=copy(Buffer,64,30); Year:=copy(Buffer,94,4); Comment:=copy(Buffer,98,30); Genre:=ord(Buffer[128]); sample:=sample_rates[version][((mp3hdr shr 10) and $3)]; dauer:=(groese*8) div ((bitrate)*1000); bits:=bitrate; vers:=version; layers:=layer; end; end;
procedure TForm3.playlistDblClick(Sender: TObject); begin form1.timer2.Enabled := false; form1.title.Caption := list[playlist.itemindex].Title; form1.mediaplayer1.FileName := list[playlist.itemindex].datei; pos := playlist.ItemIndex; form1.mediaplayer1.Open; form1.timer1.Interval := form1.mediaplayer1.TrackLength[0]; form1.timer1.Enabled := true; tpassd := 0; form1.left.Caption := inttostr(form1.mediaplayer1.tracklength[pos] div 1000); form1.position.Max := form1.mediaplayer1.TrackLength[0]; form1.position.Position := 0; form1.timer2.Enabled := true;
form1.Mediaplayer1.Play; form1.length.caption := inttostr((form1.mediaplayer1.tracklength[pos] div 1000) div 60)+ ' : ' + inttostr((form1.mediaplayer1.TrackLength[pos] div 1000) mod 60);
end;
procedure TForm3.AddClick(Sender: TObject); var i: Integer; datei: String; begin if form1.openmp3.Execute then begin
SetLength(list, 100000); for i := 0 to form1.openmp3.Files.Count - 1 do begin
datei := form1.openmp3.Files[i]; Lese_ID3Tag(datei); list[i+noft].title := ID3Tag.Titel; list[i+noft].length := ID3Tag.dauer; list[i+noft].datei := datei; if not (list[i+noft].title = '') then playlist.Items.add (list[i+noft].title) else playlist.Items.add(form1.openmp3.filename); end; end; noft := playlist.items.count; end;
procedure TForm3.Button1Click(Sender: TObject); var i,e, position: Integer; datei : String; begin playlist.Clear; noft := 0; SetLength(list, 100000); m3u := TStringlist.Create; if form1.m3uopen.Execute then begin m3u.LoadFromFile(form1.m3uopen.filename); if m3u.Strings[0] = '#EXTM3U' then begin e := 0; for i := 0 to m3u.Count - 1 do begin position := ansipos ('#' , m3u.Strings[i]); if not (position = 1) then begin try datei := m3u.Strings[i]; Lese_ID3Tag(datei); list[e].title := ID3Tag.Titel; list[e].length := ID3Tag.dauer; list[e].datei := datei; playlist.Items.add (list[e].title); except datei := m3u.Strings[e]; playlist.Items.add (datei); end; e := e+1; end; end; noft := playlist.items.count; form3.Caption := form1.m3uopen.FileName; end else showmessage ('Keine gültige m3u-Playlist!');
end;
end;
procedure TForm3.Button2Click(Sender: TObject); begin form2.showmodal; end;
procedure TForm3.playlistKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = ord('S') ) then form2.showmodal; end;
procedure TForm3.FormCreate(Sender: TObject); begin form3.Left := 0; form3.Top := form1.Top + form1.Height + 10; end;
procedure TForm3.Play1Click(Sender: TObject); begin add.Click; end;
procedure TForm3.Lschen1Click(Sender: TObject); begin playlist.Clear; pos := 0; noft := 0; end;
procedure TForm3.ffnen1Click(Sender: TObject); begin button1.Click; end;
procedure TForm3.itle1Click(Sender: TObject); begin form2.ShowModal; end;
end. |