j'ai une toute petite question mais je sens que les réponses seront un peu plus floues ...
Comment être sur que son programme libère toutes les ressources ( dll) et object qu'il créé et charge quand celui ci plante violement sans raison (du à une librairie en beta test , donc instable ;) ) ?
Car même si je libère tout ce que je créé et charge dans le Destroy , forcement quand le prog plante, il ne passe pas par là !
En fait windows va quand même libérer un certain nombre de choses (Handle sur fichier, mémoire...).
Tu peux peut être justement essayer de créer un thread juste pour exécuter l'appel à la bibli en question. Peut être que si le thread plante, ça ne fait pas tomber le processus. Je t'avoue n'avoir jamais essayé.
Tu peux essayer de mettre un try avec finally autour des appels pouvant poser problème.
Au fait je travaille avec la librairie BASS.
je travaille avec plusieurs AddOns de BASS : BASS_ASIO, BASS_FX et BASS_VST
BASS_VST est écrit en C mais j'ai trouvé sur le forum de bass (www.un4seen.com) un exemple en Delphi pour charger la dll de BASS_VST dynamiquement (pas plus mal) .
Le problème, c'est que cette librairie fonctionne bien selon les VST (certains passent, d'autres non)
J'ai beau mettre les instructions de chargement / dechargement des VST dans un bloc try , ca plante tout de même car ce n'est pas le chargement de la VST qui plante mais bien le fait de l'utiliser (je ne suis pas très clair, je le sens)
J'ai des erreurs du type : " Erreur en virgule flottante ???! "
Donc , mon prog plante à ce moment là et je me retrouve Avec BASS_Asio qui tourne tjs (utilisé avec les drivers ASIO4ALL)
Le problème, c'est que ca me bouffe 13% de mon CPU ! (c'est pas encore trop grave mais quand même ! )
Et je ne peux même pas "killer", car ca n'appairait pas dans le gestionnaire de tache...
Ce type d'erreur a lieu dans la FPU, la partie du processeur dédiée au calcul sur les flottants.
On peut contrôler la manière dont la FPU gère ces erreurs. Par exemple en cas de division par zéro, soit elle déclenche une erreur, soit elle renvoie un flottant avec un valeur particulière correspondant à l'infini.
Delphi active ces exceptions par défaut, mais tu peux lui demander de les désactiver.
Regarde l'aide de Set8087CW sous Delphi (8087 c'était le nom de la FPU du temps où c'était un composant à part).
Le problème arrive avec certains VST. Ces derniers ne respectent pas toujours le standard VST de Steinberg. Ceci dit effectivement si cet AddOn avait été codé dans les règles de l'art, il ne déclencherait aucune erreur face à ce cas de figure. Raison de plus pour passer à autre chose que Bass : Ceci dit je t'invite aussi à vérifier les versions de Bass que tu utilises : En effet il y a des incompatiblités entre elles.
Il existe une sdk sous delphi pour utiliser l'asio et les vst : il y a plus qu'à ....
j'aime la librairie Bass , il y a quand même des programmes semi-pro qui utilise BASS
et si je dis que BASS VST est une béta , c'est bien parce que je l'ai lu sur le forum, par l'admin.
La version est bonne mais il y a encore énormément de bug.
Et même les VST dites correctes peuvent planter, ca dépend de la taille de la VST (j'ai déjà remarqué que les VST >2mo avait plus de chance de planter aléatoirement ... chargement de l'editeur trop lourd peut-etre)
En plus même les VST de Steinberg peuvent planter (j'ai le cas avec DaTube, repris de Cubase LE )
Enfin, une fois que j'ai trié celles qui posent problèmes, ben y'en a plus ;)
Le gros désavantage avec BASS_VST est le temps de chargement de la VST qui est > 0.5 sec , ce qui pose pas mal de petit problèmes (coupure net du son)
J'utilise aussi Bass et ses AddOns pour un projet similaire au tien . Mon choix pour cette librairie a été que je ne voulais pas dans un premier temps m'embeter a faire des unités pour gérer les SoundFonts, les VST et l'Asio. Maintenant que je suis bien avancé dans mon projet, j'ai vite compris les limites de Bass (Entre autre ces incompatiblités de version) et j'ai hate d'etre à la seconde version pour, entre autre coder mes propres unités.
Ceci dit, j'admire le travail qu'ils ont fait meme si cet outil pas adapté et qu'il a un arrière gout d'usine à gaz .
Bass_VST admet une version 2.3 qui n'est plus une version béta. La version 2.4 est-elle en version béta mais le principal changement est la possibilité d'utiliser les VSTI.
Quant aux plantages des VST de Steinberg : j'en sais rien n'ayant pas cubase . Ceci dit il existe énormément de VST qui ne répondent pas au standard de Steinberg.
Pour la latence de 500ms quant on charge un VST : bizarre, bizarre. Aurais tu un lien pointant vers ce problème, car je n'ai pas lu cette information sur le forum de bass ? Merci d'avance.
Pour le coté semi-pro : c'est vrai mais il y a aussi pas mal de sociétés qui utilisaient bass et qui sont passées à autre chose (Fruity Loops). Ce n'est surement pas sans raison.
Toi qui aime temps tout ce qui touche à la musique, pourquoi ne pas créer tes propres outils ?
Dis Francky ,
n'aurais tu pas la lib de BASS_VST en Delphi par hasard ?
Parce que j'en ai une et je comprends maintenant les problèmes, c'est une vieille et je n'ai pas le support des VST i
(la fonction BASS_VST_ChannelCreate est inexistante )
Merci
(Sinon j'essayerais de transcire de c-> Delphi , pas gagné d'avance :( )
BASS_VST_ERROR_NOINPUTS = 3000;// the given effect has no inputs and is probably a VST instrument and no effect
BASS_VST_ERROR_NOOUTPUTS = 3001; // the given effect has no outputs
BASS_VST_ERROR_NOREALTIME = 3002; // the given effect does not support realtime processing
type
BASS_VST_PARAM_INFO = record
name : array [0..15] of Char; // examples: Time, Gain, RoomType
FUnit : array [0..15] of Char; // examples: sec, dB, type
Display : array [0..15] of Char; // the current value in a readable format, examples: 0.5, -3, PLATE
defaultValue : single; // the default value
rsvd : array [0..255] of Char;
end;
BASS_VST_INFO = record
ChannelHandle : DWORD; // the channelHandle as given to BASS_VST_ChannelSetDSP()
uniqueID :DWORD; // a unique ID for the effect (the IDs are registered at Steinberg)
effectName : array [0..79] of Char; // the effect name
effectVersion : DWORD; // the effect version
effectVstVersion : DWORD; // the VST version, the effect was written for
hostVstVersion : DWORD; // the VST version supported by BASS_VST, currently 2.4
productName : array [0..79] of Char; // the product name, may be empty
vendorName: array [0..79] of Char; // the vendor name, may be empty
vendorVersion : DWORD; // vendor-specific version number
chansIn : DWORD; // max. number of possible input channels
chansOut : DWORD; // max. number of possible output channels
initialDelay : DWORD; // for algorithms which need input in the first place, in milliseconds
hasEditor : DWORD; // can the BASS_VST_EmbedEditor() function be called?
editorWidth : DWORD; // initial/current width of the editor, also note BASS_VST_EDITOR_RESIZED
editorHeight : DWORD; // initial/current height of the editor, also note BASS_VST_EDITOR_RESIZED
aeffect : Pointer; // the underlying AEffect object (see the VST SDK)
rsvd: array [0..255] of Char;
isInstrument:DWORD;
end;
BASS_VST_ERROR_NOINPUTS = 3000;
// the given effect has no inputs and is probably a VST instrument and no effect
BASS_VST_ERROR_NOOUTPUTS = 3001; // the given effect has no outputs
BASS_VST_ERROR_NOREALTIME = 3002; // the given effect does not support realtime processing
BASS_VST_KEEP_CHANS = 1; (*By default, mono effects assigned to stereo channels
are mixed down before processing and converted back
to stereo afterwards. Set this flag to avoid this
behaviour in which case only the first channel is
affected by processing.*)
type
BASS_VST_PARAM_INFO = record
name: array[0..15] of Char; // examples: Time, Gain, RoomType
FUnit: array[0..15] of Char; // examples: sec, dB, type
Display: array[0..15] of Char;
// the current value in a readable format, examples: 0.5, -3, PLATE
defaultValue: single; // the default value
end;
BASS_VST_INFO = record
ChannelHandle: DWORD; // the channelHandle as given to BASS_VST_ChannelSetDSP()
uniqueID: DWORD; // a unique ID for the effect (the IDs are registered at Steinberg)
effectName: array[0..79] of Char; // the effect name
effectVersion: DWORD; // the effect version
effectVstVersion: DWORD; // the VST version, the effect was written for
hostVstVersion: DWORD; // the VST version supported by BASS_VST, currently 2.4
productName: array[0..79] of Char; // the product name, may be empty
vendorName: array[0..79] of Char; // the vendor name, may be empty
vendorVersion: DWORD; // vendor-specific version number
chansIn: DWORD; // max. number of possible input channels
chansOut: DWORD; // max. number of possible output channels
initialDelay: DWORD; // for algorithms which need input in the first place, in milliseconds
hasEditor: DWORD; // can the BASS_VST_EmbedEditor() function be called?
editorWidth: DWORD; // initial/current width of the editor, also note BASS_VST_EDITOR_RESIZED
editorHeight: DWORD; // initial/current height of the editor, also note BASS_VST_EDITOR_RESIZED
aeffect: Pointer; // the underlying AEffect object (see the VST SDK)
isInstrument : DWORD; //1=the VST plugin is an instrument, 0=the VST plugin is an effect *)
dspHandle : DWORD;
end;
function Load_BASSVST(const dllfilename: string): boolean;
procedure Unload_BASSVST;
implementation
function Load_BASSVST(const dllfilename: string): boolean;
var
oldmode: integer;
begin
if BASSVST_Handle <> 0 then
result := true
else
begin
oldmode := SetErrorMode($8001);
BASSVST_Handle := LoadLibrary(pchar(dllfilename));
SetErrorMode(oldmode);
if BASSVST_Handle <> 0 then
begin
if (@BASS_VST_ChannelSetDSP = nil) or
(@BASS_VST_ChannelRemoveDSP = nil) or
(@BASS_VST_EmbedEditor = nil) or
(@BASS_VST_GetInfo = nil) or
(@BASS_VST_GetParam = nil) or
(@BASS_VST_SetParam = nil) or
(@BASS_VST_GetParamCount = nil) or
(@BASS_VST_GetParamInfo = nil) or
(@BASS_VST_Resume = nil) or
(@BASS_VST_SetCallback = nil) or
(@BASS_VST_SetLanguage = nil) or
(@BASS_VST_GetBypass = nil) or
(@BASS_VST_SetBypass = nil) or
(@BASS_VST_GetProgramParam = nil) or
(@BASS_VST_SetProgramParam = nil) or
(@BASS_VST_GetProgramCount = nil) or
(@BASS_VST_GetProgram = nil) or
(@BASS_VST_SetProgram = nil) or
(@BASS_VST_GetProgramName = nil) or
(@BASS_VST_SetProgramName = nil) then
begin
MessageBox(0, PChar('Error'), PChar('Error'), 16);
FreeLibrary(BASSVST_Handle);
BASSVST_Handle := 0;
end;
end;
result := (BASSVST_Handle <> 0);
end;
end;
procedure Unload_BASSVST;
begin
if BASSVST_Handle <> 0 then
FreeLibrary(BASSVST_Handle);