SFML community forums

Help => Audio => Topic started by: Koschi on June 27, 2015, 11:06:21 am

Title: sf::Music playing a track again
Post by: Koschi on June 27, 2015, 11:06:21 am
Hi all,

I got a problem with playing a track again.

I got a std::vector<sf::Music*> with 2 tracks I can play every track once, but when i start playing again the first element nothing happens.

My question is how to repeat a played song again, without using the loop-function?
I tryed:
- stop() and then play()
- setPlayingOffset (sf::milisecond(0))
- setLoop(true) play() setLoop(false)

relevant code
void MusicManager::update()
{
    // m_isPlaying is true when manager start playing the first track
    if(!m_isPlaying || m_music[m_currentIndex]->getStatus() == sf::Music::Playing)
        return;

    if(m_currentIndex + 1 < m_music.size())
        ++m_currentIndex;
    else
        m_currentIndex = 0;
   
    m_music[m_currentIndex]->play();
}
 

Any suggestions?

Thnx.

Koschi
Title: Re: sf::Music playing a track again
Post by: Jesper Juhl on June 27, 2015, 11:55:11 am
Take a look at my Jukebox class (https://github.com/SFML/SFML/wiki/Source:-Jukebox). It can do what you want (and more) and is quite straight forward.
Title: Re: sf::Music playing a track again
Post by: eXpl0it3r on June 27, 2015, 01:28:32 pm
Have you tried playing the just as is, without your logic code?
Title: Re: sf::Music playing a track again
Post by: Hapax on June 27, 2015, 03:58:45 pm
I don't understand the need for testing m_isPlaying. Try removing that  :P
(basically, at the moment, it says that if "it's not playing" or "it is playing", you exit the update function)

Also, why are you using pointers to an sf::Music?
Title: Re: sf::Music playing a track again
Post by: Koschi on June 27, 2015, 04:31:19 pm
Take a look at my Jukebox class (https://github.com/SFML/SFML/wiki/Source:-Jukebox). It can do what you want (and more) and is quite straight forward.
Thnx for sharing code, I can't see big difference.
Have you tried playing the just as is, without your logic code?
No, but i debuged my code and he worked well, except play() want start again the music.

I don't understand the need for testing m_isPlaying. Try removing that  :P
(basically, at the moment, it says that if "it's not playing" or "it is playing", you exit the update function)

Also, why are you using pointers to an sf::Music?
When i call MusicManager::play() m_isPlaying is set true, so update method will exit when not starting playing. 'Or' when sf::Music:: is playing update methode should exit. It works!

I use pointer because resourceManager hold the origin.

So is that right, after a track is finished a simple call of play() will start again the track?

Title: Re: sf::Music playing a track again
Post by: eXpl0it3r on June 27, 2015, 05:25:48 pm
I'm not sure what you're doing, but the following code works fine for me.

#include <SFML/Audio.hpp>
#include <SFML/System.hpp>

int main()
{
        sf::Music music;
        music.openFromFile("music.ogg");
        music.play();

        while(music.getStatus() == sf::Music::Playing)
        {
                sf::sleep(sf::seconds(1.f));
        }

        music.play();

        while(music.getStatus() == sf::Music::Playing)
        {
                sf::sleep(sf::seconds(1.f));
        }
}
 

This works as well:

#include <SFML/Audio.hpp>
#include <SFML/System.hpp>

int main()
{
        sf::Music music;
        music.openFromFile("music.flac");
        music.setLoop(true);
        music.play();

        sf::sleep(sf::seconds(10.f));
}
 
Title: Re: sf::Music playing a track again
Post by: Koschi on June 27, 2015, 05:38:59 pm
try a minimal excemple and it dont work.

#include <SFML/Audio.hpp>
#include <SFML/System.hpp>
 
int main()
{
        sf::Music music;
        music.openFromFile("res/music/neue_musik.ogg");
        music.play();
 
        while(music.getStatus() == sf::Music::Playing)
        {
                sf::sleep(sf::seconds(1.f));
        }
 
        music.play(); // <-- this second play() call dont work for me, i cant hear anything
 
        while(music.getStatus() == sf::Music::Playing)
        {
                sf::sleep(sf::seconds(1.f));
        }
}
 
Title: Re: sf::Music playing a track again
Post by: Hiura on June 27, 2015, 07:32:08 pm
OS? SFML version?
Title: Re: sf::Music playing a track again
Post by: Jesper Juhl on June 27, 2015, 08:10:38 pm
What compiler? What compiler version? (adding to Hiura's question)
Title: Re: sf::Music playing a track again
Post by: Koschi on June 27, 2015, 09:26:48 pm
On my Laptop:
Win XP SP3
SFML 2.3
VC2010 pro

Test it now on my desktop computer and here it works.
on desktop computer:
Win 7
SFML 2.3
VC2010 express
Title: Re: sf::Music playing a track again
Post by: Hiura on June 27, 2015, 10:01:21 pm
My gut feeling tells me that XP is so old and deprecated that it's cause of your troubles...
Title: Re: sf::Music playing a track again
Post by: Jesper Juhl on June 27, 2015, 10:19:40 pm
Not at all related to your actual issue, but still, why on earth don't you upgrade to VS2013 (and soon 2015)???
Title: AW: sf::Music playing a track again
Post by: eXpl0it3r on June 27, 2015, 10:27:58 pm
XP only supports VS2010, plus he has an old laptop. ;)
Title: Re: AW: sf::Music playing a track again
Post by: Jesper Juhl on June 27, 2015, 10:32:28 pm
XP only supports VS2010
Not true. We build our software at work with VS2013 and target XP just fine. (Not that I like it, but it works).
Title: Re: sf::Music playing a track again
Post by: eXpl0it3r on June 27, 2015, 10:58:07 pm
Well you're missing the point. Yes you can target XP with VS 2013, but you can not develop with VS 2013 on XP. ;)
Title: Re: sf::Music playing a track again
Post by: Jesper Juhl on June 27, 2015, 11:08:21 pm
That's true :)
Title: Re: sf::Music playing a track again
Post by: Koschi on June 27, 2015, 11:15:47 pm
I think there are a lot of computer out there with Win XP.

Can anyone with XP reproduce this error?

Not at all related to your actual issue, but still, why on earth don't you upgrade to VS2013 (and soon 2015)???
It is not a fault of VC2010, so it dosent matter.

More error description:
in my minimal code the second while loop is (always) 6 times entered, then the state will switch from Playing to Stopped.

This line in SFML Code
alCheck(alGetSourcei(m_source, AL_SOURCE_STATE, &status));
set 5 times the status to Playing and the sixth call will set status to Stopped.
Title: Re: sf::Music playing a track again
Post by: Koschi on June 30, 2015, 04:05:45 pm
Test this code on second computer with xp, there it works.

So I think is a hard/software problem on my Laptop.

Thnx for help.