DÉKIBULLE UN PETIT LECTEUR AUDIO

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 13 déc. 2005 à 12:49
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 19 févr. 2006 à 15:01
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35045-dekibulle-un-petit-lecteur-audio

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
19 févr. 2006 à 15:01
Tu as oublier le code source ...
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 déc. 2005 à 10:59
oooops :



0: Caption := format('-%s',[TimeToStr(t3 / TimeAdj)]);
1: Caption := TimeToStr(t1 / TimeAdj);
2: Caption := TimeToStr(t2 / TimeAdj);
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 déc. 2005 à 10:57
alors de nouvelles ameliorations a apporter :

Zip :
- fournir les DCU HotKeyManager et CoolTrayIcon

unit1.pas :
>>> interface champs VAR (variables globale) ajouter :
TimeAdj : integer = 86400;
t1, t2, t3 : single;

>>> procedure TForm1.FormCreate

- mettre aprés "begin" : LongTimeFormat := 'nn:ss';

>>> un peu avant "procedure TForm1.Timer2Timer"

- ajouter :

procedure SetLabelTemps(const RefreshProgress : boolean = true);
var
t1, t2, t3: single;
begin
with form1 do begin
// Met à jours la barre de progression
if RefreshProgress then ProgressBar1.Position := BASS_ChannelGetPosition(Channel);
// Met à jours le temps de lecture
t1 := BASS_ChannelBytes2Seconds(Channel, ProgressBar1.Position);
t2 := BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel));
t3 := t2 - t1;
with LabelTemps do begin
case Tag of
0: Caption := format('-%s',[TimeToStr(t3 / 86400)]);
1: Caption := TimeToStr(t1 / 86400);
2: Caption := TimeToStr(t2 / 86400);
end;
end;
end;
end;

- et remplacer les procedures Time2Timer, LabelTempsMouseDown et ProgressBar1MouseMove par :

procedure TForm1.Timer2Timer(Sender: TObject);
begin
SetLabelTemps;
with Timer2 do
if t3 <= 0.5 then Interval := 10
else Interval := 500;
if t1 = t2 then LectureNext;
end;

procedure TForm1.LabelTempsMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetLabelTemps;
end;

procedure TForm1.ProgressBar1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssLeft in Shift then
begin
ProgressBar1.Position := Round(X / (ProgressBar1.Width - 4) * ProgressBar1.Max);
BASS_ChannelSetPosition(Channel, ProgressBar1.Position);
SetLabelTemps(false);
end;
end;


voila ... mmm vus les modif qu'il y a faire, envoie moi ton email par message privé et comme ça je pourrais te transmettre les modif sans devoir recréer a chaque fois un sujet.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 déc. 2005 à 10:10
c'est du delphi ... ça va etre chaud de liberer de la ram.
a moins de le faire en mode shell ... #sig#

tu peu deja optimiser completement le code, virer ce qui n'est pas necessaire.
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
16 déc. 2005 à 20:15
Merci pour vos conseils, j'ai adopté le code de FOXI et j'ai fais une mise à jours de la source.
Par contre je me demandais comment tu mesurais les 385ms ??

Est-ce que vous auriez des conseils simple pour libérer le plus de mémoire possible ? (chez moi le prog prend entre 7 et 8Mo de RAM)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
15 déc. 2005 à 04:11
ARF ARF!

VEXT est sensé etre un ensemble d'ou le const VEXT = ['','']
mais je crois que ça ne fonctionne pas avec les type STRING vus que des strings ne peuvent etre de type ordinal ...

solution (avec tableau) : perf(M = 385ms / 5x100KRq)

function ValidExt(const filename : string) : boolean;
var
X : integer;
E : string[5];
const
VEXT : array[0..8] of string[5] = ('.mp3','.ogg','.wma','.wav','.mpc','.aiff','.aif','.mp2','.mp1');
begin
E := LowerCase(ExtractFileExt(filename));
for X := 0 to 8 do begin
// ou // for X := Low(VEXT) to High(VEXT) do begin
if E = VEXT[X] then begin
result := true;
exit;
end;
end;
result := false;
end;

voila une solution rapide et fiable.
Utilisateur anonyme
14 déc. 2005 à 21:42
A pardon remplace aussi "const" par "type"

(Désoler du double post...)
Utilisateur anonyme
14 déc. 2005 à 21:40
Comem ceci
const VEXT = ('.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC');

Je pense que c'est des parenthèses, sinon il croit que tu veu declarer un tableau...
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
14 déc. 2005 à 19:21
C'est vrai qu'il y'a pas mal de code, en même temps y'a pas mal de fonctions à intégrer (apparition progressive, liste des répertoires, liste de lecture, hotkey, lecture des mp3, etc...).
J'ai relu tout le code aujourd'hui et j'ai amélioré pas mal de trucs. Par contre j'ai pas pu faire ce que tu m'avais dit: quand je déclare const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
il me marque une erreur "Type ordinal requis" ??

Si tu as des améliorations et des suggestions n'hésite surtout pas (et les autres aussi), ça m'aidera à progresser :-)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 déc. 2005 à 06:46
non justement, les traitements chaine = chaine + chaine + chaine sont trés lourd pour delphi et l'utilisation de format est beaucoup plus rapide.
maintenant tu peu toujours faire des tests de charge entre les deux methodes pour voir laquelles est la plus rapide.

par contre pour la fonction ValidExt, c'est sur et certain que c'est mieux.

j'ai remarquer deux ou trois chose encore dans ce style dans ton code, mais tu trouveras surrement de quoi il s'agit.

j'ai remarquer qu'il y avait beaucoup de code, et ce qui me donne envie de regarder en details pour voir pourquoi il y'en a autant et pondre, si possible des ameliorations.
cs_flagada Messages postés 60 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 18 février 2011
13 déc. 2005 à 22:38
Merci pour les conseils, je vais en tenir compte.
Même s'il ne me semble pas vraiment beaucoup plus clair de mettre
t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
à la place de
t := Parent.Parent.Parent.Text + '\' + Parent.Parent.Text + '\' + Parent.Text + '\' + Text;
Surtout que même si l'écriture est un peu plus lourde, je pense que le programme effectue moins de calcul avec la deuxième écriture non ?

Mais pour le "with MyTreeNode1 do begin" et le "VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];" t'as parfaitement raison c'est bcp mieux avec !

merci :)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 déc. 2005 à 12:49
juste un conseil, pour augmenter un peu la rapiditée de certaines routines remplace :

if MyTreeNode1.Level = 0 then t := MyTreeNode1.Text;
if MyTreeNode1.Level = 1 then t := MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 2 then t := MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;
if MyTreeNode1.Level = 3 then t := MyTreeNode1.Parent.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Parent.Text + '\' + MyTreeNode1.Parent.Text + '\' + MyTreeNode1.Text;

et autre ligne du genre par :

with MyTreeNode1 do begin
case Level of
0:t:=Text;
1:t:=format('%s\%s',[Parent.Text,Text]);
2:t:=format('%s\%s\%s',[Parent.Parent.Text,Parent.Text,Text]);
3:t:=format('%s\%s\%s\%s',[Parent.Parent.Parent.Text,Parent.Parent.Text,Parent.Text,Text]);
end;
end;

idem pour :

NomFichierSon := n.Strings[n.count - 3] + ' - ' + n.Strings[n.count - 2] + ' - ' + Copy(n.Strings[n.count - 1], 1, Length(n.Strings[n.count - 1]) - Length(ExtractFileExt(n.Strings[n.count - 1])))

utilisation de format...

Remplacer egalement les codes lourd et redondant par des fonctions plus simple et rapide :

comme par exemple :

if (UpperCase(ExtractFileExt(sr.name)) = '.WAV') or
(UpperCase(ExtractFileExt(sr.name)) = '.AIFF') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP3') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP2') or
(UpperCase(ExtractFileExt(sr.name)) = '.MP1') or
(UpperCase(ExtractFileExt(sr.name)) = '.OGG') or
(UpperCase(ExtractFileExt(sr.name)) = '.WMA') or
(UpperCase(ExtractFileExt(sr.name)) = '.MPC') then

remplacer par :

function ValidExt(const filename : string) : boolean;
// ensemble des extentions supportées
const VEXT = ['.WAV','.AIFF','.AIF','.MP3','.MP2','.MP1','.OGG','.WMA','.MPC'];
begin
// si l'extention se trouve dans l'ensemble
if UpperCase(ExtractFileExt(filename)) IN VEXT then
result := true
else
result := false;
end;

et declarer le IF de cette façon :

if ValidExt(sr.name) then ... code ...


voila, c'est tout ce que j'ai vus pour l'instant car je me suis pas pencher en details.
ça a l'air pas mal en tout cas, je testerais a fond plus tard.
Rejoignez-nous