Libérer les ressources + object

Signaler
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Nicolas___
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Bonjour,

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à !

Merci

Nicolas

12 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
Salut,

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.
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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... 
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
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).

En désactivant ces erreurs, ça peut aller mieux.
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
ok merci , je vais regarder à ca ...

Salut,

Bass_VST n'est pas une version béta .

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'à ....
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
j'utilise toutes les dernières versions ...

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 ?
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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 :( )

Si tu parles du header, le voici :

Unit Bass_VST;


interface


uses
  Windows;




const
  BASS_VST_PARAM_CHANGED = 1;
  BASS_VST_EDITOR_RESIZED = 2;
  BASS_VST_AUDIO_MASTER = 3;


  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;


 


VSTPROC = procedure (vstHandle : DWORD;Action : DWORD;Param1,Param2,User : DWORD);stdcall;


const BASS_VSTDLL = 'bass_vst.dll';


function BASS_VST_ChannelSetDSP (Channel : DWORD;const DLLFile : PChar;flags: DWORD; priority:Integer): DWORD;stdcall;external BASS_VSTDLL;
function BASS_VST_ChannelRemoveDSP(Channel : DWORD;vstHandle : DWORD): Bool;stdcall;external BASS_VSTDLL;


 function BASS_VST_EmbedEditor(Channel : DWORD;ParentWindow : hwnd): Bool;stdcall;external BASS_VSTDLL;


function BASS_VST_GetInfo(VSTHandle : DWORD;pInfo: Pointer):Bool;stdcall;external BASS_VSTDLL;
function BASS_VST_GetParam(vstHandle : DWORD;paramIndex : integer): single;stdcall;external BASS_VSTDLL;
function BASS_VST_SetParam(vstHandle : DWORD;paramIndex : integer;value : single): Bool;stdcall;external BASS_VSTDLL;
function BASS_VST_GetParamCount(vstHandle : DWORD) : integer;stdcall;external BASS_VSTDLL;
function BASS_VST_GetParamInfo(vstHandle : DWORD;paramIndex : Integer;var Info : BASS_VST_PARAM_INFO): boolean;stdcall;external BASS_VSTDLL;
function BASS_VST_Resume(vstHandle : DWORD):Bool;stdcall;external BASS_VSTDLL;
function BASS_VST_SetCallback(vstHandle : DWORD; PROC : Pointer; user : DWORD):Bool;stdcall;external BASS_VSTDLL;
function BASS_VST_SetLanguage(const Lang : PChar):Bool;stdcall;external BASS_VSTDLL;
function BASS_VST_SetBypass(vstHandle : DWORD; state:boolean):bool;stdcall;external BASS_VSTDLL;
function BASS_VST_GetBypass(vstHandle : DWORD):dword;stdcall;external BASS_VSTDLL;


function BASS_VST_ChannelCreate(freq : DWORD; Chans : DWORD; const DLLFile : PChar; flags: DWORD): DWORD;stdcall;external BASS_VSTDLL;
function BASS_VST_ChannelFree(vstHandle : DWORD): BOOL;stdcall;external BASS_VSTDLL;
function BASS_VST_ProcessEvent(vstHandle : DWORD; midiCh : DWORD; event : DWORD; param : DWORD): BOOL;stdcall;external BASS_VSTDLL;


implementation


end.
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
oui, c'est ca :)

ou l'as tu trouvé ?

moi je l'ai mais en version dynamique (mais c'est une vieille version ) :
unit cst_Dynamic_Bassvst;

interface

uses
  Windows;

const
  BASS_VST_PARAM_CHANGED = 1;
  BASS_VST_EDITOR_RESIZED = 2;
  BASS_VST_AUDIO_MASTER = 3;

  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;

  VSTPROC = procedure(vstHandle: DWORD; Action: DWORD; Param1, Param2, User: DWORD); stdcall;

var

  BASS_VST_ChannelSetDSP: function(ChanHandle: DWORD; const DLLFile: PChar; flags: DWORD; priority:
    Integer): DWORD; stdcall;
  BASS_VST_ChannelRemoveDSP: function(ChanHandle: DWORD; vstHandle: DWORD): BOOL; stdcall;
  BASS_VST_EmbedEditor: function(vstHandle: DWORD; ParentWindow: hwnd): BOOL; stdcall;
  BASS_VST_GetInfo: function(vstHandle: DWORD; pInfo: pointer): BOOL; stdcall;
  BASS_VST_GetParam: function(vstHandle: DWORD; paramIndex: integer): single; stdcall;
  BASS_VST_SetParam: function(vstHandle: DWORD; paramIndex: integer; value: single): BOOL; stdcall;
  BASS_VST_GetParamCount: function(vstHandle: DWORD): integer; stdcall;
  BASS_VST_GetParamInfo: function(vstHandle: DWORD; paramIndex: Integer; var Info:
    BASS_VST_PARAM_INFO): boolean; stdcall;
  BASS_VST_Resume: function(vstHandle: DWORD): BOOL; stdcall;
  BASS_VST_SetCallback: function(vstHandle: DWORD; PROC: Pointer; user: DWORD): BOOL; stdcall;
  BASS_VST_SetLanguage: function(const Lang: PChar): BOOL; stdcall;
  BASS_VST_GetBypass: function(vstHandle: DWORD): DWORD; stdcall;
  BASS_VST_SetBypass: function(vstHandle: DWORD; state: boolean): BOOL; stdcall;
  BASS_VST_GetProgramParam: function(vstHandle: DWORD; programIndex: Integer): PSingle; stdcall;
  BASS_VST_SetProgramParam: function(vstHandle: DWORD; programIndex: Integer; const param:
    PSingle): BOOL; stdcall;
  BASS_VST_GetProgramCount: function(vstHandle: DWORD): Integer; stdcall;
  BASS_VST_GetProgram: function(vstHandle: DWORD): Integer; stdcall;
  BASS_VST_SetProgram: function(vstHandle: DWORD; programIndex: Integer): BOOL; stdcall;
  BASS_VST_GetProgramName: function(vstHandle: DWORD; programIndex: Integer): PChar; stdcall;
  BASS_VST_SetProgramName: function(vstHandle: DWORD; programIndex: Integer; const name: PChar):
    BOOL; stdcall;

var
  BASSVST_Handle: Thandle = 0;

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

      @BASS_VST_ChannelSetDSP := GetProcAddress(BASSVST_Handle, 'BASS_VST_ChannelSetDSP');
      @BASS_VST_ChannelRemoveDSP := GetProcAddress(BASSVST_Handle, 'BASS_VST_ChannelRemoveDSP');
      @BASS_VST_EmbedEditor := GetProcAddress(BASSVST_Handle, 'BASS_VST_EmbedEditor');
      @BASS_VST_GetInfo := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetInfo');
      @BASS_VST_GetParam := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetParam');
      @BASS_VST_SetParam := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetParam');
      @BASS_VST_GetParamCount := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetParamCount');
      @BASS_VST_GetParamInfo := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetParamInfo');
      @BASS_VST_Resume := GetProcAddress(BASSVST_Handle, 'BASS_VST_Resume');
      @BASS_VST_SetCallback := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetCallback');
      @BASS_VST_SetLanguage := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetLanguage');
      @BASS_VST_GetBypass := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetBypass');
      @BASS_VST_SetBypass := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetBypass');
      @BASS_VST_GetProgramParam := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetProgramParam');
      @BASS_VST_SetProgramParam := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetProgramParam');
      @BASS_VST_GetProgramCount := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetProgramCount');
      @BASS_VST_GetProgram := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetProgram');
      @BASS_VST_SetProgram := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetProgram');
      @BASS_VST_GetProgramName := GetProcAddress(BASSVST_Handle, 'BASS_VST_GetProgramName');
      @BASS_VST_SetProgramName := GetProcAddress(BASSVST_Handle, 'BASS_VST_SetProgramName');

      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);

  BASSVST_Handle := 0;
end;

end.

(si ca peux t'être utile ... )

Je l'ai trouvé sur le forum de Bass. Par contre avec cet header rencontre tu encore ces problèmes de latence lors du chargement des VST ?
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
oui , je ne pense pas que l'header joue ...

De plus , il y a quand même bcp de VSTi que je n'arrive pas à charger (Avec BASS_VST_ChannelCreate ,j'ai des erreurs )

Mais je ne me suis pas encore trop penché sur ce dernier point

en tout cas merci

Nico