Table of Contents

Lecteur mp3

Par MickaGL (Veuillez me citer dans les sources si vous utilisez cette fonction, merci !)

Fontionne exclusivement avec la dernière révision de SFML 2.

Voici une classe utilisant la bibliothèque mpg123 (http://www.mpg123.de/index.shtml) qui permet la lecture de fichier mp3.
Fonctionne sur le même principe que sf::Music

Attention, le décodage de fichiers MP3 est soumis à une licence stricte, et est payant dans le cadre d'une utilisation non personnelle.
http://www.mp3licensing.com/

Mp3.h

#ifndef MP3_H_INCLUDED
#define MP3_H_INCLUDED
 
#include <SFML/Audio.hpp>
#include "mpg123.h"
 
namespace sfe
{
class Mp3 : public sf::SoundStream
{
public :
    Mp3();
    ~Mp3();
 
    bool OpenFromFile(const std::string& filename);
 
protected :
    bool OnGetData(Chunk& data);
    void OnSeek(float timeOffset);
 
private :
    mpg123_handle*      myHandle;
    size_t              myBufferSize;
    unsigned char*      myBuffer;
    sf::Mutex           myMutex;
};
 
} // namespace sfe
 
#endif // MP3_H_INCLUDED

Mp3.cpp

#include "Mp3.h"
#include <iostream>
 
namespace sfe
{
Mp3::Mp3() :
myHandle    (NULL),
myBufferSize(0),
myBuffer    (NULL)
{
 
}
 
Mp3::~Mp3()
{
    Stop();
 
    if (myBuffer)
    {
        delete [] myBuffer;
        myBuffer = NULL;
    }
 
    mpg123_close(myHandle);
    mpg123_delete(myHandle);
    mpg123_exit();
}
 
bool Mp3::OpenFromFile(const std::string& filename)
{
    Stop();
 
    int  err = MPG123_OK;
    if ((err = mpg123_init()) != MPG123_OK)
    {
        std::cerr << mpg123_plain_strerror(err) << std::endl;
        return false;
    }
 
    myHandle = mpg123_new(NULL, &err);
    if (!myHandle)
    {
        std::cerr << "Unable to create mpg123 handle: " << mpg123_plain_strerror(err) << std::endl;
        return false;
    }
 
    if (mpg123_open(myHandle, filename.c_str()) != MPG123_OK)
    {
        std::cerr << mpg123_strerror(myHandle) << std::endl;
        return false;
    }
 
    long rate = 0;
    int  channels = 0, encoding = 0;
    if (mpg123_getformat(myHandle, &rate, &channels, &encoding) != MPG123_OK)
    {
        std::cerr << "Failed to get format information for \"" << filename << "\"" << std::endl;
        return false;
    }
 
    myBufferSize = mpg123_outblock(myHandle);
    myBuffer = new unsigned char[myBufferSize];
    if (!myBuffer)
    {
        std::cerr << "Failed to reserve memory for decoding one frame for \"" << filename << "\"" << std::endl;
        return false;
    }
 
    Initialize(channels, rate);
 
    return true;
}
 
bool Mp3::OnGetData(Chunk& data)
{
    sf::Lock lock(myMutex);
 
    if (myHandle)
    {
        size_t done;
        mpg123_read(myHandle, myBuffer, myBufferSize, &done);
 
        data.Samples   = (short*)myBuffer;
        data.NbSamples = done/sizeof(short);
 
        return (data.NbSamples > 0);
    }
    else
        return false;
}
 
void Mp3::OnSeek(float timeOffset)
{
    sf::Lock lock(myMutex);
 
    if (myHandle)
        mpg123_seek(myHandle, timeOffset, 0);
}
 
} // namespace sfe

main.cpp

#include <SFML/Graphics.hpp>
#include "Mp3.h"
 
int main()
{
    sf::RenderWindow application(sf::VideoMode::GetDesktopMode(), "", sf::Style::Fullscreen);
 
    sfe::Mp3 musique;
    if (!musique.OpenFromFile("music.mp3"))
        exit(EXIT_FAILURE);
    musique.Play();
 
    while (application.IsOpened())
    {
        sf::Event evenement;
        while (application.GetEvent(evenement))
        {
            if ((evenement.Type == sf::Event::KeyPressed) && (evenement.Key.Code == sf::Key::Escape))
                application.Close();
 
            if ((evenement.Type == sf::Event::KeyPressed) && (evenement.Key.Code == sf::Key::P))
            {
                if (musique.GetStatus() != sf::SoundStream::Paused)
                    musique.Pause();
                else
                    musique.Play();
            }
        }
 
        if (musique.GetStatus() != sf::SoundStream::Playing && musique.GetStatus() != sf::SoundStream::Paused)
            application.Close();
 
        application.Clear();
 
        application.Display();
    }
 
    return EXIT_SUCCESS;
}
 
fr/sources/player_mp3.txt · Last modified: 2011/03/06 22:15 by mickagl
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki