Musique qui grésille [Console]

BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 - 28 mai 2008 à 13:12
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 - 2 juin 2008 à 18:44
Bonjour à tous,
    Je programme actuellement une console qui fait un peu tout...bref en gros il contient une boucle while( !kbhit())
où se trouve dedans plein de petite fonction genre si l'heure actuelle
n'est pas l'heur afficher, l'afficher, si l'heure actuelle = = l'heure à
laquelle il y a une alarme ou un arrêt systeme programmer,
l'executer... Et enfin un petit player qui lit toute les musiques contenues dans "ma musique". Or la musique grésille
et je pense que cela est dû à la boucle !kbhit() car si je met un grand
Sleep(), ca ne le fait plus mais lorsqu'on veu rentrer une commande, la
boucle met (trop) longtemps à s'interrompre...
>Je voudrais
donc savoir si quelqu'un aurais une solution pour ne pas que ca
grésille sachant que si on l'ouvre via une 2e console, il faut que je puisse récupérer le titre le tps total et la position de la musique (via mciSendString(...);

Si ca peu vous aider, voici la boucle mais je rappel qu'elle doit pouvoir être interrompu rapidement (2 à 3 secondes grand MAX)
J'ai mi la partie player en noir et le reste en gris

  while ( !kbhit() )
       {
           gotoy(7);
          if(nbr2 == 0)
          {
               gotox(nbr1+1);
               Color(4,0);
               printf(" *");
              nbr1 ++;
          }
          if(nbr2 == 1)
          {
               gotox(nbr1-1);
               Color(4,0);
               printf("* ");
              nbr1 --;
          }
          if(nbr1 == 78)
          {
                nbr2 = 1;
          }
          if(nbr1 == 0)
          {
                nbr2 = 0;
          }

   // --- Lire l'horloge et la convertir en heure locale
   time_t Time = time(NULL);
   struct tm* pTM = localtime(&Time);
   ///
                if((pTM->tm_sec) != H2)
        {
            H2 = (pTM->tm_sec);
            gotoxy(63,11);
            Color(10,4);
            printf("%0.2d", pTM->tm_sec);
            gotoxy(51,11);
            Color(10,4);
            printf("%0.2d", pTM->tm_min);
            gotoxy(19,11);
            Color(10,4);
            printf("%2.2d.%2.2d.%4.4d ", Today.tm_mday, Today.tm_mon + 1 , pTM->tm_year + 1900);
            gotoxy(19,10);
            printf("%s", aszJours[pTM->tm_wday]);
            gotoxy(19,12);
            printf("%s", aszMois[pTM->tm_mon]);
            gotoxy(40,11);
            printf("%0.2d", pTM->tm_hour);
        }
        gotoxy(35,29);
        printf("");
    if(ha != 25)
    {
      if(pTM->tm_hour == ha)
        {
            if(pTM->tm_min >= ma)
            {
                Color(10,0);
                printf("arr%ct du syst%cme...", 136, 138);
                system("SHUTDOWN -s -t 00");
                ha = 25;
            }
        }
    }//h != 25
    if(h != 25)
    {
      if(pTM->tm_hour == h)
        {
            if(pTM->tm_min >= m)
            {
                Color(10,0);
                printf("%c%c%c %s",205,205,16, msg);
                h = 25;
                while ( !kbhit() )
                  {
                beep(300,1000);
                sleep(200);
                  }
                keybd_event(VK_NUMPAD1,0x61,0,0);         //Simulation appuie sur 1
                keybd_event(VK_NUMPAD1,0x61,KEYEVENTF_KEYUP, 0);       //relache 1
                keybd_event(VK_RETURN,0x1c,0,0);        // Simulation appuie ENTREE
                keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP, 0);     // Relache entrée
            }//if(H % 3600 / 60 != m)
        }//if(H % 86400 / 3600 + 1 != h, H % 3600 / 60 != m);
    }//if(h != 25)
    sleep(50);

        W++;
        ///*************************************************************/
if(player == 1)
{
    Color(7,0);
    BouclePlayer++;
     if((hFind != INVALID_HANDLE_VALUE) && (positionInt != totalInt))
    {        if((secmusique 0) && (minmusique 0) && (BouclePlayer == 1))
        {
            hFind = FindFirstFile(szMP3, &wFindData);
            nbrM = 0;
            if(Aleatoire == 1)
            {
                srand(time(NULL));
                nbrA = ((rand() % (MAX - 0 + 1)) + 0);
                do
                {
                    FindNextFile(hFind, &wFindData);
                    nbrM++;
                }while(nbrA != nbrM);
            }
            else if(Aleatoire != 1)
            {
                do
                {
                    FindNextFile(hFind, &wFindData);
                    nbrM++;
                }while(nbrA != nbrM);
            }
            FindClose(hFind);
            nbrA++;
            gotoxy(27,3);
            printf("                                                  ");
            gotoxy(27,4);
            printf("                                                  ");
            sprintf(tmp, "open "C:\\DOCUME~1\\%s\\MESDOC~1\\MAMUSI~1\\%s" alias mysound1", Nom, wFindData.cFileName);
            mciSendString(tmp, 0, 0, 0);//open
            mciSendString("play mysound1", 0, 0, 0);
            Color(15,0);
            Cadre(26,2,2,51);
            Color(7,0);
            gotoxy(27,3);
            printf("%s",wFindData.cFileName);
            mciSendString("status mysound1 length", total, 300, 0);
            totalInt = atoi(total);
            gotoxy(28,4);
            printf("     / 0:%2d", (totalInt / 1000) % 60);
            gotox(WhereX()-5);
            printf("%2d:\n", (totalInt / 1000) %3600 / 60);
        }
        if ((totalInt-1) >= positionInt)
        {
            mciSendString("status mysound1 position", position, 300, 0);
            positionInt = atoi(position);
 /******/
            if((positionIntA/1000) != (positionInt/1000))
            {
                gotoxy(31,4);
                printf("%2d\n", (positionInt / 1000) % 60);
                gotoxy(28,4);
                printf("%2d:", (positionInt / 1000) %3600 / 60);
                positionIntA = positionInt;
                secmusique++;
            }
    if(hFind == INVALID_HANDLE_VALUE)
    {
        player = 0;
        FindClose(hFind);
    }

    if((totalInt-1) <= (positionInt))
    {
        BouclePlayer = 0;
        minmusique = 0;
        secmusique = 0;
        positionInt = 0;
        positionIntA = 0;
        totalInt = 1;
        mciSendString("close mysound1",0, 0, 0);
    }
    gotoxy(35,29);
    if(W <= 299)
    {
        Sleep(1500);
    }
    else
    {
        Sleep(1400);
    }
}//player == 1

        ///*************************************************************/
        /**/
        if(W == 300)
        {
            gotoxy(10,28);
Color(9,0);
printf("BBBBBBBBBBBb.           LLL   \n");
gotoxy(10,29);
sleep(75);
printf("BB          Bb          LLL  \n");
gotoxy(10,30);
sleep(75);
printf("BB           Bb         LLL   \n");
gotoxy(10,31);
sleep(75);
printf("BB           BB         LLL  \n");
gotoxy(10,32);
sleep(75);
printf("BBBBBBBBBBBBBB          LLL  \n");
gotoxy(10,33);
sleep(75);
printf("BB           Bb         LLL                     \n");
gotoxy(10,34);
sleep(75);
printf("BB           BB         LLLL                    \n");
gotoxy(10,35);
sleep(75);
printf("BB           B'         LLLLLLLLLLLLLLLL        \n");
gotoxy(10,36);
sleep(75);
printf("BBBBBBBBBBBBB'          LLLLLLLLLLLLLLLL        \n");
sleep(75);
gotoxy(47,27);
Color(4,0);
printf("    __________    __________  \n");
gotoxy(47,28);
printf("   ///     ///   ///          \n");
gotoxy(47,29);
printf("  ///     ///   ///_______    \n");
gotoxy(47,30);
printf(" ///     ///           ///    \n");
gotoxy(47,31);
printf("///_____///   ________///     \n");
        }
    if(W >= 300)
    {
Color(12,0);
gotoxy(74,28);
printf("%c", 184);
gotoxy(73,31);
printf("Veille");
sleep(100);
Color(4,0);
gotoxy(74,28);
printf("%c", 184);
gotoxy(73,31);
printf("Veille");
    }
}
/////////////////////////////////////////////////////////

Je
mettrais sûrement, lorsque j'aurais une version vraiment fiable, la
source complète (qui est un espèce de mini faux OS lol) sur le site.
(ca s'appel BLos)

MERCI d'avance
//Merci à tous de vous interesser à mon problème, Cordialement,

10 réponses

pepsidrinker Messages postés 151 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 15 avril 2009
28 mai 2008 à 15:13
Je parles sans avoir verifier, mais est tu bien sur que mciSendString("play mysound1", 0, 0, 0); est du asyncron?
Pepsidrinker
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
28 mai 2008 à 17:45
Bonjour,
    Je ne sais pas mais je sais que ca fonctionne comme ca ;-) (du moins pour lire le son etc...) mais ca grésille (sauf quand on met un grand Sleep après "play" mais la boucle est beaucoup trop longue à s'interrompre...)

//Merci à tous de vous interesser à mon problème,Cordialement,
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
28 mai 2008 à 18:12
Salut
En mettant un Sleep d'une seconde, ca gresille encore? C'est etonnant.

A partir de combien de temps de tempo ta musique ne gresille plus?

Pour repondre a pepsidrinker, oui les fonctions mci... sont bien asynchrone.

A+
Mon site internet : http://pistol.petesampras.free.fr
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
28 mai 2008 à 18:34
Bonjour,
 Oui, moins mais ca grésille encore pas mal, surtout avec les musique ou il y a de la guitard électrique ou des musique ou ca bouge pas mal. pas fort ca s'entend pas énormément mais dès qu'on monte un peu le son, on l'entend bien...
 Ca ne gresille plus vers ~3500~4000 msmais mon objectif de base était de ne pas dépasser 1 sec pour la boucle complète... et même pour la réactivitée du programme, je ne doit pas aller au dela. (Je peu mettre 2sec vraiment en dernier recours...)

//Merci à tous de vous interesser à mon problème,Cordialement,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
29 mai 2008 à 10:07
C'est tres etrange que ca gressille encore avec 1 seconde de pause...

Essaye d'executer cette fonction dans un thread, ca reglera peut etre le probleme.

A+
Mon site internet : http://pistol.petesampras.free.fr
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
29 mai 2008 à 17:46
Bonjour,
 Pourrais-tu expliquer comment faire STP pour créer un thread?
D'après ce que je sais, je pense en effet que ca peu résoudre le problème

//Merci à tous de vous interesser à mon problème,Cordialement,
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
29 mai 2008 à 18:21
Salut

Regarde l'exemple de la msdn http://msdn.microsoft.com/en-us/library/ms682516(VS.85).aspx sur la creation de thread.

C'est assez simple, il y a juste une fonction a utiliser: CreateThread()

A+
Mon site internet : http://pistol.petesampras.free.fr
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
29 mai 2008 à 19:05
Bonsoir,
 Le code exemple est en C++ et génère donc quelque erreurs à la compilation.
Je chercherais si je rtouve un code en C et vous tiendrais au courant
(avec le code exemple, j'ai :
|3|strsafe.h: No such file or directory|
|In function `main':|
|27|error: 'for' loop initial declaration used outside C99 mode|
|75|error: redefinition of 'i'|
|27|error: previous definition of 'i' was here|
|75|error: 'for' loop initial declaration used outside C99 mode|||Build finished: 5 errors, 0 warnings|
)

//Merci à tous de vous interesser à mon problème,Cordialement,
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
30 mai 2008 à 19:27
for(int i = 0; ...)

Simplement à déclarer i comme n'importequ'elle autre variable en C non-C99 : En début de bloc de code.

{
    // déclaration des variables
    int i;
    ...

    for(i = 0; ...)
    ...
}

C++ (@++)<!--
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
2 juin 2008 à 18:44
Finalement j'ai essayé sur un autre PC et avec Sleep(1500); (le mien est bien à la ramasse...),  ca ne grésille pas donc je vais faire comme ca pour faire plus simple
Merci quand même à tous de m'avoir aidé

//Merci à tous de vous interesser à mon problème,Cordialement,
0
Rejoignez-nous