Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [2.0] - Lecteur de musique very light  (Lu 6090 fois)

0 Membres et 1 Invité sur ce sujet

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
[2.0] - Lecteur de musique very light
« le: Novembre 08, 2012, 01:07:56 pm »
Vous allez être déçus, c'est un lecteur très très [...] léger. Il a pour simple but de lire les fichiers qui lui sont passés comme arguments :

#include"SFML/Audio/Music.hpp"

int main(int argc, char *argv[])
{
    sf::Music music;
    if(argc<2)
        return 0;
    for( int i(1) ; i<argc ; ++i)
    {
        try
        {
            music.openFromFile(argv[i]);
            music.play();
            while(music.getStatus() == sf::Music::Playing)
            {}
        }
        catch(...)
        {}
    }
    return 0;
}
 

Sûrement que ça n'intéresse personne, je l'ai fait pour avoir une lecture instantanée des fichiers sons sur windows (en passant par le registre) car j'en avais assez de devoir charger une interface pour une simple lecture d'un son de 5 ms.

Je ne pense pas que ce code marche sur linux et/ou mac mais j'aimerais bien le savoir.
De plus est-ce que mon bloc try/catch est propre ?
« Modifié: Novembre 08, 2012, 01:11:47 pm par Basta »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #1 le: Novembre 08, 2012, 01:24:55 pm »
Citer
Je ne pense pas que ce code marche sur linux et/ou mac
Pourquoi pas ? Tu utilises 3 fonctions SFML, difficile d'avoir quelque chose de non-portable là-dedans ;)

Citer
De plus est-ce que mon bloc try/catch est propre ?
Il ne sert strictement à rien, SFML ne lance pas d'exception. Par contre tu devrais plutôt vérifier le retour de openFromFile.

Ensuite, tu devrais aussi mettre un petit sf::sleep dans ta boucle, histoire de ne pas bouffer tout le CPU pour rien.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #2 le: Novembre 08, 2012, 03:56:45 pm »
Et bien à cause des arguments, je ne sais pas si ils sont utilisés de la même manière sur les différents OS.
Je suis bête, j'ai cru qu'il y avait un exception à cause d'un message d'erreur et j'ai ajouté un try/catch ...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #3 le: Novembre 08, 2012, 04:07:12 pm »
Citer
Et bien à cause des arguments, je ne sais pas si ils sont utilisés de la même manière sur les différents OS.
A part le premier, que tu n'utilises de toute façon pas, ça devrait être bon.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #4 le: Novembre 08, 2012, 04:35:21 pm »
Merci pour les infos, le code devient donc :

#include"SFML/Audio/Music.hpp"
#include"SFML/System/Sleep.hpp"

int main(int argc, char *argv[])
{
    sf::Music music;
    if(argc<2)
        return 0;
    for( int i(1) ; i<argc ; ++i)
    {
        if(music.openFromFile(argv[i]))
        {
            music.play();
            sf::sleep(music.getDuration());
        }
    }
    return 0;
}
 

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #5 le: Novembre 08, 2012, 04:50:47 pm »
Il s'avère par contre que tous mes fichiers sons sont lus en même temps en utilisant sf::sleep :/.

kamui

  • Sr. Member
  • ****
  • Messages: 291
    • Voir le profil
Re : Re : [2.0] - Lecteur de musique very light
« Réponse #6 le: Novembre 08, 2012, 04:55:41 pm »
Il s'avère par contre que tous mes fichiers sons sont lus en même temps en utilisant sf::sleep :/.

Je ne penses pas que cela vienne du sf::sleep, c'est que play est une méthode non-bloquante (d'après la doc, le morceau est joué dans un thread qui lui est dédié, pour ne pas bloquer le reste du programme). Sans le sf::sleep, est tu sur que tes morceaux ne sont pas joués en même temps ?

la vérité est ailleurs ;D

edit : issu de la doc de sf::Music::play(...) : Start or resume playing the audio stream.

This function starts the stream if it was stopped, resumes it if it was paused, and restarts it from beginning if it was it already playing. This function uses its own thread so that it doesn't block the rest of the program while the stream is played.


ce sera mieux qu'une traduction hasardeuse à partir de mon mauvais anglais
« Modifié: Novembre 08, 2012, 04:57:30 pm par kamui »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #7 le: Novembre 08, 2012, 05:00:05 pm »
play() ne bloque pas, mais sf::sleep si ;)

Du coup c'est pas normal.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #8 le: Novembre 08, 2012, 05:16:56 pm »
Lorsque j'utilisais la boucle while, les sons étaient bien joués l'un après l'autre.
Ou alors c'est getDuration() qui ne vas pas ? je vais voir quelle est sa valeur.

Edit : Eh bien en commençant ce test je m'aperçois que les sons sont maintenant joués correctement, bizarre :O.
« Modifié: Novembre 08, 2012, 05:20:44 pm par Basta »

kamui

  • Sr. Member
  • ****
  • Messages: 291
    • Voir le profil
Re : Re : [2.0] - Lecteur de musique very light
« Réponse #9 le: Novembre 08, 2012, 05:21:34 pm »
Lorsque j'utilisais la boucle while, les sons étaient bien joués l'un après l'autre.
Ou alors c'est getDuration() qui ne vas pas ? je vais voir quelle est sa valeur.

sa valeur est la durée totale de ta musique.

Mais comme dit Laurent, sf::sleep est bloquante, du coup tant que sf::sleep ne s'est pas terminée, tu ne devrais pas pouvoir entendre la deuxième musique, vu que le loadFromMemory n'a pas été rappelé).

Question bête, t'es sur d'avoir compilé ;D ?

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : [2.0] - Lecteur de musique very light
« Réponse #10 le: Novembre 08, 2012, 05:37:05 pm »
J'ai dû compiler en debug au lieu de release x).

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : [2.0] - Lecteur de musique very light
« Réponse #11 le: Novembre 08, 2012, 05:39:20 pm »
d'ou l'idée de mettre un
std::cout << "Compile date" << __DATE__ << '\n';
au début de ton programme ;)

 

anything