• R/O
  • SSH
  • HTTPS

id3v2editorplus: Commit


Commit MetaInfo

Revision28 (tree)
Time2019-09-14 06:30:44
Authorderekwildstar

Log Message

- Concluído o reprodutor SYLT, agora usando threads a fim de poder manipular milissegundos diretamente
- Criada a função BASSTempoDecorridoEmMilissegundos
- Alterada a função de BASSTempoDecorrido para BASSTempoDecorridoEmSegundos
- Pequenas melhorias visuais
- A reprodução agora é parada no OnClose do form principal

Change Summary

Incremental Difference

--- trunk/V2/src/UBassUtils.pas (revision 27)
+++ trunk/V2/src/UBassUtils.pas (revision 28)
@@ -9,7 +9,8 @@
99 procedure BASSFinalizar;
1010 procedure BASSDescarregarStream;
1111 function BASSEstaReproduzindo: Boolean;
12-function BASSTempoDecorrido: Word;
12+function BASSTempoDecorridoEmSegundos: Word;
13+function BASSTempoDecorridoEmMilissegundos: Cardinal;
1314
1415 implementation
1516
@@ -80,7 +81,7 @@
8081 Result := (StreamDaMusica > 0) and (BASS_ChannelIsActive(StreamDaMusica) = BASS_ACTIVE_PLAYING);
8182 end;
8283
83-function BASSTempoDecorrido: Word;
84+function BASSTempoDecorridoEmSegundos: Word;
8485 begin
8586 Result := 0;
8687
@@ -88,4 +89,13 @@
8889 Result := Round(BASS_ChannelBytes2Seconds(StreamDaMusica, BASS_ChannelGetPosition(StreamDaMusica,BASS_POS_BYTE)));
8990 end;
9091
92+function BASSTempoDecorridoEmMilissegundos: Cardinal;
93+begin
94+ Result := 0;
95+
96+ if StreamDaMusica > 0 then
97+ Result := Round(BASS_ChannelBytes2Seconds(StreamDaMusica, BASS_ChannelGetPosition(StreamDaMusica,BASS_POS_BYTE)) * 1000);
98+end;
99+
100+
91101 end.
--- trunk/V2/src/UClassesAjudantes.pas (revision 27)
+++ trunk/V2/src/UClassesAjudantes.pas (revision 28)
@@ -354,7 +354,7 @@
354354 procedure TID3v2TagHelper.ObterSYLT(ASYLT: TSYLT);
355355 var
356356 Conteudo: TBytes;
357- SYLT: TSYLTItem;
357+ SYLTItem: TSYLTItem;
358358 // - ///////////////////////////////////////////////////////////////////////////
359359 function ObterStringTerminadaEmNulo(AAPartirDe: Word; out AProximoIndice: Word): String;
360360 var
@@ -363,7 +363,7 @@
363363 Result := '';
364364
365365 // ISO-8859-1
366- if SYLT.CodificacaoDoTexto = 0 then
366+ if SYLTItem.CodificacaoDoTexto = 0 then
367367 begin
368368 for i := AAPartirDe to High(Conteudo) do
369369 if Conteudo[i] = 0 then
@@ -399,19 +399,18 @@
399399 begin
400400 Conteudo := GetBytes(i);
401401
402- SYLT := ASYLT.Add;
403- SYLT.CodificacaoDoTexto := Conteudo[0];
402+ SYLTItem := ASYLT.Add;
403+ SYLTItem.CodificacaoDoTexto := Conteudo[0];
404404 Idioma[0] := Conteudo[1];
405405 Idioma[1] := Conteudo[2];
406406 Idioma[2] := Conteudo[3];
407- SYLT.Idioma := Idioma;
408- SYLT.FormatoDoRotuloDeTempo := Conteudo[4];
409- SYLT.TipoDeConteudo := Conteudo[5];
410- SYLT.Descricao := ObterStringTerminadaEmNulo(6,ProximoIndice);
411- SYLT.AdicionarConteudo(Conteudo,ProximoIndice);
407+ SYLTItem.Idioma := Idioma;
408+ SYLTItem.FormatoDoRotuloDeTempo := Conteudo[4];
409+ SYLTItem.TipoDeConteudo := Conteudo[5];
410+ SYLTItem.Descricao := ObterStringTerminadaEmNulo(6,ProximoIndice);
411+ SYLTItem.AdicionarConteudo(Conteudo,ProximoIndice);
412412 end;
413413 end;
414-//procedure SetUnicodeSyncedLyrics
415414
416415 procedure TID3v2TagHelper.ObterUSLT(AUSLT: TUSLT);
417416 var
--- trunk/V2/src/UClassesETipos.pas (revision 27)
+++ trunk/V2/src/UClassesETipos.pas (revision 28)
@@ -89,9 +89,20 @@
8989 property Conteudo: TList<TSYLTVerso> read FConteudo write FConteudo;
9090 end;
9191
92+ TSYLT = class;
93+
94+ TSYLTThread = class(TThread)
95+ private
96+ FSYLT: TSYLT;
97+ public
98+ constructor Create(ASYLT: TSYLT); reintroduce;
99+ procedure Execute; override;
100+ end;
101+
92102 TSYLT = class(TCollection)
93103 private
94104 FIndice: SmallInt;
105+ FSYLTThread: TSYLTThread;
95106
96107 FSaidaAnterior: TLabel;
97108 FSaidaCentral: TLabel;
@@ -115,6 +126,8 @@
115126 procedure SetItem(AIndex: Integer; const AValue: TSYLTItem);
116127 public
117128 constructor Create(ASaidaAnterior: TLabel; ASaidaCentral: TLabel; ASaidaPosterior: TLabel; AIdioma: TComboBox; AFormatoDoRotuloDeTempo: TComboBox; ATipoDeConteudo: TComboBox; ADescricao: TLabeledEdit; AProximaSYLT: TAction; SYLTTAnterior: TAction; ASalvarSYLT: TAction; ARemoverSYLT: TAction; ASubstituirSYLT: TAction; AContador: TLabel; AContadorSombra: TLabel);
129+ + destructor Destroy; override;
118130
119131 procedure Limpar;
120132 function Add: TSYLTItem; overload;
@@ -122,7 +135,9 @@
122135 procedure SYLTAnterior(APrimeira: Boolean = False);
123136 procedure ProximaSYLT(AUltima: Boolean = False);
124137 procedure SalvarLetraComo(ACaixaDeDialogoParaSalvarLetra: TSaveDialog);
125- procedure ExibirVerso(ASegundos: Word);
138+ procedure ExibirVerso(APosicao: Cardinal);
139+ procedure IniciarThread;
140+ procedure FinalizarThread;
126141
127142 property Items[AIndex: Integer]: TSYLTItem read GetItem write SetItem; default;
128143 end;
@@ -130,7 +145,7 @@
130145 implementation
131146
132147 uses
133- ActiveX, Vcl.Forms, WinAPI.Windows, MSHTML;
148+ ActiveX, Vcl.Forms, WinAPI.Windows, MSHTML, UBassUtils;
134149
135150 { TUSLT }
136151
@@ -593,6 +608,12 @@
593608 FContadorSombra := AContadorSombra;
594609 end;
595610
611+destructor TSYLT.Destroy;
612+begin
613+ FinalizarThread;
614+ inherited;
615+end;
616+
596617 procedure TSYLT.ExibirLetra(AIndiceDaLetra: Word);
597618 begin
598619 if (Count = 0) or (AIndiceDaLetra > Pred(Count)) then
@@ -626,13 +647,13 @@
626647 AtualizarEstadoDosComponentesDeSaida;
627648 end;
628649
629-procedure TSYLT.ExibirVerso(ASegundos: Word);
650+procedure TSYLT.ExibirVerso(APosicao: Cardinal);
630651 begin
631652 if (FIndice = -1) or (Items[FIndice].Conteudo.Count = 0) then
632653 Exit;
633654
634655 for var i: Word := 0 to Pred(Items[FIndice].Conteudo.Count) do
635- if Items[FIndice].Conteudo[i].Tempo = ASegundos * 1000 then
656+ if Items[FIndice].Conteudo[i].Tempo = APosicao then
636657 begin
637658 FSaidaAnterior.Caption := '####### INÍCIO #######';
638659 FSaidaPosterior.Caption := '######## FIM ########';
@@ -649,11 +670,29 @@
649670 end;
650671 end;
651672
673+procedure TSYLT.FinalizarThread;
674+begin
675+ if Assigned(FSYLTThread) then
676+ begin
677+ FSYLTThread.Terminate;
678+ FSYLTThread := nil;
679+ end;
680+end;
681+
652682 function TSYLT.GetItem(AIndex: Integer): TSYLTItem;
653683 begin
654684 Result := TSYLTItem(inherited GetItem(AIndex));
655685 end;
656686
687+procedure TSYLT.IniciarThread;
688+begin
689+ if (Count > 0) and (FIndice > -1) and (Items[FIndice].Conteudo.Count > 0) then
690+ begin
691+ FSYLTThread := TSYLTThread.Create(Self);
692+ FSYLTThread.Start;
693+ end;
694+end;
695+
657696 procedure TSYLT.Limpar;
658697 begin
659698 Clear;
@@ -720,4 +759,23 @@
720759 ExibirLetra(FIndice);
721760 end;
722761
762+{ TSYLTThread }
763+
764+constructor TSYLTThread.Create(ASYLT: TSYLT);
765+begin
766+ inherited Create(True);
767+ FreeOnTerminate := True;
768+ FSYLT := ASYLT;
769+end;
770+
771+procedure TSYLTThread.Execute;
772+begin
773+ // Propositalmente não estou usando Synchronize com ExibirVerso porque é mais
774+ // rápido, consome menos ciclos de CPU e porque os 3 labels só são atualizados
775+ // pela própria thread, nunca externamente enquanto a thread está em execução.
776+ // Imagino que isso não cause problemas, mas se causar, coloque o Synchronize
777+ while not Terminated do
778+ FSYLT.ExibirVerso(BASSTempoDecorridoEmMilissegundos);
779+end;
780+
723781 end.
--- trunk/V2/src/UDAMOPrincipal.pas (revision 27)
+++ trunk/V2/src/UDAMOPrincipal.pas (revision 28)
@@ -235,7 +235,7 @@
235235
236236 function TDAMOPrincipal.ReproducaoConcluida: Boolean;
237237 begin
238- Result := BASSTempoDecorrido >= FTempoTotalDoArquivoAtual;
238+ Result := BASSTempoDecorridoEmSegundos >= FTempoTotalDoArquivoAtual;
239239 end;
240240
241241 procedure TDAMOPrincipal.Reproduzir;
@@ -250,6 +250,7 @@
250250 AtualizarBotoesDoReprodutor;
251251
252252 TIMEReprodutor.Iniciar;
253+ FSYLT.IniciarThread;
253254 end;
254255
255256 procedure TDAMOPrincipal.SalvarID3v1;
@@ -354,6 +355,7 @@
354355
355356 BASSPararReproducao;
356357
358+ FSYLT.FinalizarThread;
357359 TIMEReprodutor.Parar;
358360
359361 AtualizarTempoDecorrido(True);
@@ -900,10 +902,11 @@
900902 Atual := 0;
901903
902904 if not AZero then
903- Atual := BASSTempoDecorrido;
905+ Atual := BASSTempoDecorridoEmSegundos;
904906
905907 TFORMPrincipal(Owner).LABETempo.Caption := FormatDateTime('nn:ss',Atual / (24 * 60 * 60)) + ' / ' + FormatDateTime('nn:ss',FTempoTotalDoArquivoAtual / (24 * 60 * 60));
906- FSYLT.ExibirVerso(Atual);
908+// TFormPrincipal(Owner).Caption := BASSTempoDecorridoEmMilissegundos.ToString;
909+// FSYLT.ExibirVerso(BASSTempoDecorridoEmMilissegundos);
907910 end;
908911
909912 procedure TDAMOPrincipal.TIMELetreiroTimer(Sender: TObject);
@@ -923,7 +926,6 @@
923926 begin
924927 AtualizarTempoDecorrido;
925928
926- verificar se a bass retorna milissegundos
927929 // O timer só estará em execução se houver uma reprodução em andamento,
928930 // portanto podemos, com segurança, verificar se precisamos passar para uma
929931 // próxima música apenas verificando se a reprodução atual foi concluída
--- trunk/V2/src/UFORMPrincipal.pas (revision 27)
+++ trunk/V2/src/UFORMPrincipal.pas (revision 28)
@@ -124,6 +124,7 @@
124124 procedure ID3v2Modificado(Sender: TObject);
125125 procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
126126 procedure FormShow(Sender: TObject);
127+ procedure FormClose(Sender: TObject; var Action: TCloseAction);
127128 private
128129 { Private declarations }
129130 FDAMOPrincipal: TDAMOPrincipal;
@@ -157,6 +158,11 @@
157158 inherited;
158159 end;
159160
161+procedure TFORMPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
162+begin
163+ FDAMOPrincipal.ACTNPararReproducao.Execute;
164+end;
165+
160166 procedure TFORMPrincipal.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
161167 begin
162168 if FDAMOPrincipal.ExistemModificacoes then
Show on old repository browser