Forum de la communauté SFML

Général => Projets SFML => Discussion démarrée par: Basta le Novembre 08, 2012, 01:07:56 pm

Titre: [2.0] - Lecteur de musique very light
Posté par: Basta 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 ?
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Laurent 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.
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Basta 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 ...
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Laurent 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.
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Basta 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;
}
 
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Basta 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 :/.
Titre: Re : Re : [2.0] - Lecteur de musique very light
Posté par: kamui 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
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Laurent le Novembre 08, 2012, 05:00:05 pm
play() ne bloque pas, mais sf::sleep si ;)

Du coup c'est pas normal.
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Basta 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.
Titre: Re : Re : [2.0] - Lecteur de musique very light
Posté par: kamui 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 ?
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: Basta le Novembre 08, 2012, 05:37:05 pm
J'ai dû compiler en debug au lieu de release x).
Titre: Re : [2.0] - Lecteur de musique very light
Posté par: lezebulon 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 ;)