• R/O
  • SSH
  • HTTPS

id3v2editorplus: Commit


Commit MetaInfo

Revision25 (tree)
Time2019-09-10 07:00:01
Authorderekwildstar

Log Message

Pressa pra ir embora :)

Change Summary

Incremental Difference

--- trunk/V2/src/UClassesAjudantes.pas (revision 24)
+++ trunk/V2/src/UClassesAjudantes.pas (revision 25)
@@ -103,16 +103,110 @@
103103 if ASYLT.Count = 0 then
104104 Exit;
105105
106+ var Dados: TBytes;
107+ var Letra: TSYLTVerso;
108+
106109 for var SYLT: TCollectionItem in ASYLT do
107110 begin
108- Continue aqui, para cada elemento criar um frame SYLT
111+ // O cabeçalho de um frame ID3v2 é:
112+ //
113+ // Frame ID.: 4 bytes (caracteres) que identificam o frame
114+ // Size.....: 4 bytes (32 bits Big Endian) que indicam o tamanho total do frame (sem contar os 10 bytes do cabeçalho)
115+ // Flags....: 2 bytes que contém opções diversas para o frame atual
116+ //
117+ // A estrutura do frame SYLT vem após o cabeçalho e é:
118+ //
119+ // Text Encoding......: 1 byte que pode ser 0 (ANSI) ou 1 (UNICODE)
120+ // Language...........: 3 bytes que representam o idioma utilizado nos textos do frame
121+ // Time Stamp Format..: 1 byte que pode ser 1 (MPEG FRAMES) ou 2 (MILISSEGUNDOS)
122+ // Content type.......: 1 byte que representa do que se trata o SYLT e pode assumir valores de 0 a 6 (vide datasheet)
123+ // Content descriptor.: String terminada em 00 (ANSI) ou 00 00 (UNICODE) que descreve o SYLT atual
124+ // Letra sincronizada.: Composta de várias strings terminadas em 00 (ANSI) ou 00 00 (UNICODE), seguidas de 4 bytes (32 bits Big Endian) que representam o rótulo de tempo da string
125+ //
126+ // A biblioteca ID3v2 já lida com o cabeçalho. Tudo que precisa ser feito
127+ // aqui é manipular o membro Stream e definir o conteúdo do frame
128+ with Frames[AddFrame('SYLT')] do
129+ begin
130+ // Configura o array Dados para que ele tenha 3 bytes, pois, tirando a
131+ // letra sincronizada, esta é a maior quantidade de dados que serão
132+ // escritos no Stream do frame. Isso evita ter que ficar usando SetLength
133+ SetLength(Dados,3);
109134
110- melhor usar addframe e fazer tudo na mão! SetUnicodeContent é limitado
111- SetUnicodeContent(AddFrame('SYLT'),);
135+ // Text Encoding (UNICODE sempre)
136+ Dados[0] := $01;
137+ Stream.Write(Dados, 1);
112138
139+ // Language
140+ Dados[0] := TSYLTItem(SYLT).Idioma[0];
141+ Dados[1] := TSYLTItem(SYLT).Idioma[1];
142+ Dados[2] := TSYLTItem(SYLT).Idioma[2];
143+ Stream.Write(Dados, 3);
113144
145+ // Time Stamp Format
146+ Dados[0] := TSYLTItem(SYLT).FormatoDoRotuloDeTempo;
147+ Stream.Write(Dados,1);
114148
149+ // Content type
150+ Dados[0] := TSYLTItem(SYLT).TipoDeConteudo;
151+ Stream.Write(Dados,1);
115152
153+ // Content Descriptor ($FF e $FE são o BOM UNICODE)
154+ Dados[0] := $FF;
155+ Stream.Write(Dados, 1);
156+ Dados[0] := $FE;
157+ Stream.Write(Dados, 1);
158+ Stream.Write(PWideChar(TSYLTItem(SYLT).DescricaoDoConteudo)^, (Length(TSYLTItem(SYLT).DescricaoDoConteudo) + 1) * 2);
159+
160+ // Letra sincronizada
161+ for Letra in TSYLTItem(SYLT).Conteudo do
162+ begin
163+ Dados[0] := $FF;
164+ Stream.Write(Dados, 1);
165+ Dados[0] := $FE;
166+ Stream.Write(Dados, 1);
167+ Stream.Write(PWideChar(Letra.Texto)^, (Length(Letra.Texto) + 1) * 2);
168+ end;
169+
170+
171+
172+
173+
174+
175+
176+
177+
178+
179+
180+// Frames[FrameIndex].Stream.Clear;
181+// Data := $01;
182+// Frames[FrameIndex].Stream.Write(Data, 1);
183+// Data := $FF;
184+// Frames[FrameIndex].Stream.Write(Data, 1);
185+// Data := $FE;
186+// Frames[FrameIndex].Stream.Write(Data, 1);
187+// Frames[FrameIndex].Stream.Write(PWideChar(Text)^, (Length(Text) + 1) * 2);
188+// Frames[FrameIndex].Stream.Seek(0, soFromBeginning);
189+
190+
191+
192+
193+
194+
195+
196+
197+
198+
199+
200+ end;
201+
202+// Continue aqui, para cada elemento criar um frame SYLT
203+//
204+// melhor usar addframe e fazer tudo na mão! SetUnicodeContent é limitado
205+// SetUnicodeContent(,);
206+
207+
208+
209+
116210 // SetUnicodeLyrics(AddFrame('USLT'), TUSLTItem(USLT).Texto,TUSLTItem(USLT).Idioma,TUSLTItem(USLT).Descricao);
117211 end;
118212 end;
--- trunk/V2/src/UClassesETipos.pas (revision 24)
+++ trunk/V2/src/UClassesETipos.pas (revision 25)
@@ -90,13 +90,23 @@
9090 TSYLT = class(TCollection)
9191 private
9292 FIndice: SmallInt;
93+ FIdioma: TComboBox;
94+ FDescricaoDoConteudo: TLabeledEdit;
9395
9496 procedure AtualizarEstadoDosComponentesDeSaida;
97+
98+ procedure LetraAPartirDoControle(ALetra: TList<TSYLTVerso>);
99+
100+ function GetItem(AIndex: Integer): TSYLTItem;
101+ procedure SetItem(AIndex: Integer; const AValue: TSYLTItem);
95102 public
96103 constructor Create;
97104
98105 procedure Limpar;
99106 function Add: TSYLTItem; overload;
107+ procedure ConfirmarInformacoesDaLetra;
108+
109+ property Items[AIndex: Integer]: TSYLTItem read GetItem write SetItem; default;
100110 end;
101111
102112
@@ -536,6 +546,25 @@
536546 end;
537547 end;
538548
549+procedure TSYLT.ConfirmarInformacoesDaLetra;
550+var
551+ IdDoIdioma: TLanguageID;
552+begin
553+ if (Count = 0) or (FIndice = -1) then
554+ Exit;
555+
556+ with Items[FIndice] do
557+ begin
558+ // Existem outras propriedades que não estão sendo alteradas. Aqui apenas
559+ // devem ser incluídas referências a propriedades que o usuário final pode
560+ // alterar
561+ StringToLanguageID(Self.FIdioma.Text,IdDoIdioma);
562+ Idioma := IdDoIdioma;
563+ DescricaoDoConteudo := Self.FDescricaoDoConteudo.Text;
564+ LetraAPartirDoControle(Conteudo);
565+ end;
566+end;
567+
539568 constructor TSYLT.Create;
540569 begin
541570 inherited Create(TSYLTItem);
@@ -542,6 +571,17 @@
542571 FIndice := -1;
543572 end;
544573
574+function TSYLT.GetItem(AIndex: Integer): TSYLTItem;
575+begin
576+ Result := TSYLTItem(inherited GetItem(AIndex));
577+end;
578+
579+procedure TSYLT.LetraAPartirDoControle(ALetra: TList<TSYLTVerso>);
580+begin
581+ // Implemente isso, gerando um tbytes com a letra sincronizada obtida a partir
582+ // do controle de tela.
583+end;
584+
545585 procedure TSYLT.Limpar;
546586 begin
547587 Clear;
@@ -552,4 +592,9 @@
552592 AtualizarEstadoDosComponentesDeSaida;
553593 end;
554594
595+procedure TSYLT.SetItem(AIndex: Integer; const AValue: TSYLTItem);
596+begin
597+ inherited SetItem(AIndex, AValue);
598+end;
599+
555600 end.
--- trunk/V2/src/UDAMOPrincipal.pas (revision 24)
+++ trunk/V2/src/UDAMOPrincipal.pas (revision 25)
@@ -300,10 +300,9 @@
300300 FID3v2Tag.AtribuirUSLT(FUSLT);
301301
302302 { Letra sincronizada da música }
303-// FSYLT.ConfirmarInformacoesDaLetra;
304-// FID3v2Tag.AtribuirSYLT(FSYLT);
303+ FSYLT.ConfirmarInformacoesDaLetra;
304+ FID3v2Tag.AtribuirSYLT(FSYLT);
305305
306-
307306 PararReproducao;
308307 BASSDescarregarStream;
309308 try
Show on old repository browser