begin process at 2012 05 27 17:48:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Multimédia

 > PLUGIN ECHO POUR WINAMP

PLUGIN ECHO POUR WINAMP


 Information sur la source

Note :
Aucune note
Catégorie :Multimédia Classé sous :winampdspheader, winampdspmodule, winamp, dsp, dsph Niveau :Initié Date de création :21/01/2007 Date de mise à jour :22/01/2007 20:23:05 Vu / téléchargé :5 458 / 130

Auteur : gabuzomeuh

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale

Plugin Echo pour Winamp.
Permet d'ajouter de l'écho.
Une version plus complète bientot.
Testé avec Winamp 2.95
Compilé avec Visual C++ 6.0
Compiler et copier ou copier le fichier "dsp_test.dll" dans le répertoire de winamp -->  C:\Program Files\Winamp\Plugins\

Source

  • #include <stdio.h>
  • #include <windows.h>
  • #include <commctrl.h>
  • #include "dsp.h"
  • #include "resource.h"
  • #define NB_ECHO_BUFFERS 10 //
  • BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
  • {
  • return TRUE;
  • }
  • HWND echo_control_hwnd;
  • int quit_echo=0;
  • winampDSPModule *getModule(int which);
  • void config(struct winampDSPModule *this_mod);
  • int initecho(struct winampDSPModule *this_mod);
  • void quitecho(struct winampDSPModule *this_mod);
  • int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);
  • static BOOL CALLBACK echoProc (HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
  • winampDSPHeader hdr = { DSP_HDRVER, "Nullsoft DSP demo v0.3 for Winamp 2", getModule };
  • int volume_general;
  • int gain_echo_L1;
  • int gain_echo_R1;
  • short echo1_actif = 1;
  • //****************************************************************************
  • winampDSPModule mod =
  • {
  • "echo",
  • NULL, // hwndParent
  • NULL, // hDllInstance
  • config,
  • initecho,
  • modify_samples1,
  • quitecho
  • };
  • //****************************************************************************
  • #ifdef __cplusplus
  • extern "C" {
  • #endif
  • __declspec( dllexport ) winampDSPHeader *winampDSPGetHeader2()
  • {
  • return &hdr;
  • }
  • #ifdef __cplusplus
  • }
  • #endif
  • //****************************************************************************
  • winampDSPModule *getModule(int which)
  • {
  • switch (which)
  • {
  • case 0: return &mod;
  • default:return NULL;
  • }
  • }
  • //****************************************************************************
  • void config(struct winampDSPModule *this_mod)
  • {
  • MessageBox(this_mod->hwndParent,"Rock'n'roll :)","Configuration",MB_OK);
  • }
  • //****************************************************************************
  • // initialisation du module
  • int initecho(struct winampDSPModule *this_mod)
  • {
  • quit_echo=0;
  • ShowWindow((echo_control_hwnd=CreateDialog(this_mod->hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),this_mod->hwndParent,echoProc)),SW_SHOW);
  • return 0;
  • }
  • //****************************************************************************
  • // fonction quit du module
  • void quitecho(struct winampDSPModule *this_mod)
  • {
  • if (this_mod == &mod)
  • {
  • quit_echo=1;
  • if (echo_control_hwnd)
  • {
  • DestroyWindow(echo_control_hwnd);
  • echo_control_hwnd=0;
  • }
  • }
  • }
  • //****************************************************************************
  • int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)
  • {
  • static short buffer[NB_ECHO_BUFFERS][4096];
  • static int i,j;
  • if (bps == 16 && nch == 2)
  • {
  • // mettre le bloc entrant dans le dernier bloc du buffer
  • for (i = 0; i < numsamples*nch; i+=2)
  • {
  • buffer[NB_ECHO_BUFFERS-1][i] = samples[i]; // voie gauche
  • buffer[NB_ECHO_BUFFERS-1][i+1] = samples[i+1]; // voie droite
  • }
  • // calculer l'echo avec le premier bloc et le bloc entrant
  • for (i = 0; i < numsamples*nch; i+=2)
  • {
  • samples[i] = buffer[0][i] * echo1_actif * gain_echo_L1/100 + buffer[NB_ECHO_BUFFERS-1][i]; // voie gauche
  • samples[i+1] = buffer[0][i+1] * echo1_actif * gain_echo_R1/100 + buffer[NB_ECHO_BUFFERS-1][i+1]; // voie droite
  • }
  • // volume general
  • for (i = 0; i < numsamples*nch; i+=2)
  • {
  • samples[i] = samples[i] * volume_general/100; // voie gauche
  • samples[i+1] = samples[i+1] * volume_general/100; // voie droite
  • }
  • // memoriser le bloc sortant
  • for (i = 0; i < numsamples*nch; i+=2)
  • {
  • buffer[NB_ECHO_BUFFERS-1][i] = samples[i]; // voie gauche
  • buffer[NB_ECHO_BUFFERS-1][i+1] = samples[i+1]; // voie droite
  • }
  • // decaler tous les blocs vers la gauche pour laisser la place au prochain bloc entrant
  • for (j = 0; j < NB_ECHO_BUFFERS-1; j++)
  • {
  • for (i = 0; i < numsamples*nch; i+=2)
  • {
  • buffer[j][i] = buffer[j+1][i]; // voie gauche
  • buffer[j][i+1] = buffer[j+1][i+1]; // voie droite
  • }
  • }
  • }
  • return numsamples;
  • }
  • //****************************************************************************
  • // procedure fenetre echo
  • static BOOL CALLBACK echoProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • if (uMsg == WM_DESTROY)
  • {
  • }
  • if (uMsg == WM_COMMAND)
  • {
  • if(wParam == IDC_CHECK1)
  • {
  • if (IsDlgButtonChecked(hwndDlg , IDC_CHECK1) == BST_UNCHECKED)
  • {
  • SetDlgItemText(hwndDlg, IDC_CHECK1, "OFF");
  • echo1_actif = 0;
  • }
  • if (IsDlgButtonChecked(hwndDlg , IDC_CHECK1) == BST_CHECKED)
  • {
  • SetDlgItemText(hwndDlg, IDC_CHECK1, "ON");
  • echo1_actif = 1;
  • }
  • }
  • }
  • if (uMsg == WM_INITDIALOG)
  • {
  • SetWindowPos(hwndDlg, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE); // positionner la fenetre en haut a gauche
  • CheckDlgButton(hwndDlg, IDC_CHECK1, TRUE); // echo actif au demarrage
  • SetDlgItemText(hwndDlg, IDC_CHECK1, "ON");
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETRANGEMAX,0,100); // volume general a fond
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETRANGEMIN,0,0);
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETPOS,1,0);
  • volume_general = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",volume_general);
  • SetDlgItemText(hwndDlg,IDC_STATIC_VOLUME_GENERAL,str);
  • }
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETRANGEMAX,0,100);
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETRANGEMIN,0,0);
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETPOS,1,50);
  • gain_echo_L1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",gain_echo_L1);
  • SetDlgItemText(hwndDlg,IDC_STATIC_GAINL1,str);
  • }
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETRANGEMAX,0,100);
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETRANGEMIN,0,0);
  • SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETPOS,1,50);
  • gain_echo_R1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",gain_echo_R1);
  • SetDlgItemText(hwndDlg,IDC_STATIC_GAINR1,str);
  • }
  • }
  • if (uMsg == WM_VSCROLL)
  • {
  • volume_general = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",volume_general);
  • SetDlgItemText(hwndDlg,IDC_STATIC_VOLUME_GENERAL,str);
  • }
  • gain_echo_L1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",gain_echo_L1);
  • SetDlgItemText(hwndDlg,IDC_STATIC_GAINL1,str);
  • }
  • gain_echo_R1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_GETPOS,0,0);
  • {
  • char str[8];
  • wsprintf(str,"%d",gain_echo_R1);
  • SetDlgItemText(hwndDlg,IDC_STATIC_GAINR1,str);
  • }
  • }
  • return 0;
  • }
  • //****************************************************************************
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>
#include "dsp.h"
#include "resource.h"

#define NB_ECHO_BUFFERS 10 // 

BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
 return TRUE;
}

HWND echo_control_hwnd;

int quit_echo=0;

winampDSPModule *getModule(int which);

void config(struct winampDSPModule *this_mod);
int initecho(struct winampDSPModule *this_mod);
void quitecho(struct winampDSPModule *this_mod);
int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate);

static BOOL CALLBACK echoProc (HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);

winampDSPHeader hdr = { DSP_HDRVER, "Nullsoft DSP demo v0.3 for Winamp 2", getModule };

int volume_general;
int gain_echo_L1;
int gain_echo_R1;
short echo1_actif = 1;

//****************************************************************************

winampDSPModule mod =
{
 "echo",
 NULL,	// hwndParent
 NULL,	// hDllInstance
 config,
 initecho,
 modify_samples1,
 quitecho
};

//****************************************************************************

#ifdef __cplusplus
extern "C" {
#endif

__declspec( dllexport ) winampDSPHeader *winampDSPGetHeader2()
{
 return &hdr;
}
#ifdef __cplusplus
}
#endif

//****************************************************************************

winampDSPModule *getModule(int which)
{
  switch (which)
   {
    case 0: return &mod;
    default:return NULL;
   }
}

//****************************************************************************

void config(struct winampDSPModule *this_mod)
{
 MessageBox(this_mod->hwndParent,"Rock'n'roll :)","Configuration",MB_OK);
}

//****************************************************************************

// initialisation du module
int initecho(struct winampDSPModule *this_mod)
{
 quit_echo=0;		
 ShowWindow((echo_control_hwnd=CreateDialog(this_mod->hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),this_mod->hwndParent,echoProc)),SW_SHOW); 
 return 0;
}

//****************************************************************************

// fonction quit du module
void quitecho(struct winampDSPModule *this_mod)
{
 if (this_mod == &mod)
  {
   quit_echo=1;
   if (echo_control_hwnd)
    {
     DestroyWindow(echo_control_hwnd);
     echo_control_hwnd=0;
    }
  }
}

//****************************************************************************

int modify_samples1(struct winampDSPModule *this_mod, short int *samples, int numsamples, int bps, int nch, int srate)
 {
  static short buffer[NB_ECHO_BUFFERS][4096];
  static int i,j;

  if (bps == 16 && nch == 2)
   {

    // mettre le bloc entrant dans le dernier bloc du buffer
    for (i = 0; i < numsamples*nch; i+=2)
     {
      buffer[NB_ECHO_BUFFERS-1][i]   = samples[i];   // voie gauche
      buffer[NB_ECHO_BUFFERS-1][i+1] = samples[i+1]; // voie droite
     }


    // calculer l'echo avec le premier bloc et le bloc entrant
    for (i = 0; i < numsamples*nch; i+=2)
     {
      samples[i]   = buffer[0][i]   * echo1_actif * gain_echo_L1/100 + buffer[NB_ECHO_BUFFERS-1][i];   // voie gauche
      samples[i+1] = buffer[0][i+1] * echo1_actif * gain_echo_R1/100 + buffer[NB_ECHO_BUFFERS-1][i+1]; // voie droite
     }


    // volume general
    for (i = 0; i < numsamples*nch; i+=2)
     {
      samples[i]   = samples[i]   * volume_general/100; // voie gauche
      samples[i+1] = samples[i+1] * volume_general/100; // voie droite
     } 


    // memoriser le bloc sortant
    for (i = 0; i < numsamples*nch; i+=2)
     {
      buffer[NB_ECHO_BUFFERS-1][i]   = samples[i];   // voie gauche
      buffer[NB_ECHO_BUFFERS-1][i+1] = samples[i+1]; // voie droite
     }


    // decaler tous les blocs vers la gauche pour laisser la place au prochain bloc entrant    
    for (j = 0; j < NB_ECHO_BUFFERS-1; j++)    
     {
      for (i = 0; i < numsamples*nch; i+=2)
       {
        buffer[j][i]   = buffer[j+1][i];   // voie gauche
        buffer[j][i+1] = buffer[j+1][i+1]; // voie droite
       }
     }
   }

  return numsamples;
}


//****************************************************************************

// procedure fenetre echo
static BOOL CALLBACK echoProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  
  if (uMsg == WM_DESTROY)
   {
   }
   
  if (uMsg == WM_COMMAND)
   {
    if(wParam == IDC_CHECK1)
     {
      if (IsDlgButtonChecked(hwndDlg , IDC_CHECK1) == BST_UNCHECKED)
       {
        SetDlgItemText(hwndDlg, IDC_CHECK1, "OFF");
        echo1_actif = 0;
       }
      if (IsDlgButtonChecked(hwndDlg , IDC_CHECK1) == BST_CHECKED)
       {
        SetDlgItemText(hwndDlg, IDC_CHECK1, "ON");
        echo1_actif = 1;
       }
     }
   }


  if (uMsg == WM_INITDIALOG)
   {    
    SetWindowPos(hwndDlg, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE); // positionner la fenetre en haut a gauche
        
    CheckDlgButton(hwndDlg, IDC_CHECK1, TRUE); // echo actif au demarrage
    SetDlgItemText(hwndDlg, IDC_CHECK1, "ON");

    SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETRANGEMAX,0,100); // volume general a fond
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETRANGEMIN,0,0);
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_SETPOS,1,0);
    volume_general = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",volume_general);
      SetDlgItemText(hwndDlg,IDC_STATIC_VOLUME_GENERAL,str);
     }

    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETRANGEMAX,0,100);
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETRANGEMIN,0,0);
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_SETPOS,1,50);
    gain_echo_L1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",gain_echo_L1);
      SetDlgItemText(hwndDlg,IDC_STATIC_GAINL1,str);
     }

    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETRANGEMAX,0,100);
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETRANGEMIN,0,0);
    SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_SETPOS,1,50);
    gain_echo_R1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",gain_echo_R1);
      SetDlgItemText(hwndDlg,IDC_STATIC_GAINR1,str);
     }
   }




  if (uMsg == WM_VSCROLL)
   {
    volume_general = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_VOLUME_GENERAL,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",volume_general);
      SetDlgItemText(hwndDlg,IDC_STATIC_VOLUME_GENERAL,str);
     }    
    gain_echo_L1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINL1,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",gain_echo_L1);
      SetDlgItemText(hwndDlg,IDC_STATIC_GAINL1,str);
     }
    gain_echo_R1 = 100-SendDlgItemMessage(hwndDlg,IDC_SLIDER_GAINR1,TBM_GETPOS,0,0);
     {
      char str[8];
      wsprintf(str,"%d",gain_echo_R1);
      SetDlgItemText(hwndDlg,IDC_STATIC_GAINR1,str);
     }
   }





return 0;
}

//****************************************************************************


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

22 janvier 2007 20:23:05 :
1: correction des erreurs de pointage du buffer 2: ajout d'un check de coupure directe de l'echo

 Sources du même auteur

Source avec Zip Source avec une capture MOTEUR AUDIO TEMPS REEL AVEC GESTION DU VOLUME
Source avec Zip Source avec une capture GÉNÉRATEUR DE SIGNAL BASSE FRÉQUENCE TEMPS RÉEL
MODIFIER LA HAUTEUR DE LA BARRE DE TACHES
Source avec Zip Source avec une capture GÉNÉRATEUR DE FICHIER WAV DE RÉFÉRENCE POUR CD DE TEST
Source avec Zip ICONE DANS BARRE DE TACHES AVEC GESTION DOUBLE CLIC DROIT OU...

 Sources de la même categorie

Source avec Zip ADAPTER LES TEMPS DE SUBTITLES DE SOUS TITRAGE ENTRE DEUX LA... par berrami
Source avec Zip Source avec une capture DÉTECTION DE VISAGE (YEUX, NEZ, BOUCHE) AVEC OPENCV EN TEMPS... par MadM@tt
Source avec Zip Source avec une capture GÉNÉRATEUR FM EXPÉRIMENTAL par tontonCD
Source avec Zip LECTEUR MULTIMÉDIA par omegatou
Source avec Zip IMPLÉMENTATION D'UN ALGORITHME DE COMPRESSION/DECOMPRESSION ... par eemikhm

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PLAYLIST WINAMP par christophelande
Source avec Zip GÉNÉRATION DE PLAYLIST M3U POUR WINAMP [VC 6.0] par metalseb

Commentaires et avis

Commentaire de acx01b le 15/02/2007 14:46:49

salut peux - tu expliquer juste l'algo que tu as utiliser pour calculer l'echo ?

merci

Commentaire de gabuzomeuh le 15/02/2007 18:25:56


L'algorithme est de type récursif avec y[n] = x[n] + a*y[n-b] avec:
variable x: echantillon d'entrée,
variable y: echantillon de sortie,
variable a: coefficient de reinjection variant de 0 à 1,
variable b: profondeur du retard c'est à dire nombre d'echantillons en arrière.

L'algorithme est tirée de la théorie générale du traitement du signal.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Gestion du déplacement à la Winamp ! [ par Manson ] 'lut,j'aimerais implémenter dans mon prog, fais en Visual C, le meme principe que Winamp pour déplacer les fenetres. En fait dans Winamp pour déplacer Controle Winamp... [ par erasor ] Salu je suis total n00b et je voudrai savoir comment controler winamp en c++,j'ai suivi le tutorial de winamp.com mais je n'abouti a rien alors si que Controle Winamp... [ par erasor ] Salu je suis total n00b et je voudrai savoir comment controler winamp en c++,j'ai suivi le tutorial de winamp.com mais je n'abouti a rien alors si que Commande Winamp 3 [ par Mirada2000 ] Je voudrais créer 4 executable afin de donenr 4 action distinctes a winamp 3 :- Play/Pause- Stop- SUivant- Précédentcela avait deja été fait pour wina Winamp [ par MaitreDragon ] Bonjour,Je voudrais pouvoir controler winamp par programmation (lecture, pause, stop,volume,...) sous borland c++ builder 5.Quelqu'un saurait-il comme winamp path [ par BombStrike ] Comment récuperer le path de winamp dans la base de registre ? Merci :)je sais juste que c'est stocké dans HKEY_CURRENT_USER\Software\Winamp\\(Défaut) Comment avoir une icone ou une btimap d'un fichier? [ par JackosKing ] Voilà, je voulais savoir si l'on pouvais simplement avoir l'icone ou une bitmap d'un fichier.. par exemple celle d'un exe ou alors d'un .mp3 (l'icone Programme fonctionnant en arriere plan [ par bdkiller ] Bonjour, je cherche a faire un programme qui va fonctionner en arriere plan, cad je crée un controlleur de winamp, et j'utilise ceci comme code: (je s [HOOK]Encore le meme probleme.. [ par bdkiller ] Salut,Bon, après pas mal d'heures passés là-dessus, j'ai la DLL qui se compile sans erreurs, l'appli principale qui se compile sans erreurs également! Plugins Winamp ! [ par PaTaTe ] Bonjour,Je suis (très très) débutant en C/C++, je préfère Visual Basic (non pas la tête).Je cherche un moyen de faire un OCX (en C) permettant de gére


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales