-
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
-
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.
-
Have you tried playing the just as is, without your logic code?
-
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?
-
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?
-
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));
}
-
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));
}
}
-
OS? SFML version?
-
What compiler? What compiler version? (adding to Hiura's question)
-
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
-
My gut feeling tells me that XP is so old and deprecated that it's cause of your troubles...
-
Not at all related to your actual issue, but still, why on earth don't you upgrade to VS2013 (and soon 2015)???
-
XP only supports VS2010, plus he has an old laptop. ;)
-
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).
-
Well you're missing the point. Yes you can target XP with VS 2013, but you can not develop with VS 2013 on XP. ;)
-
That's true :)
-
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.
-
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.