SFML community forums

Help => Audio => Topic started by: Me-Myself-And-I on October 15, 2023, 03:58:39 am

Title: Playing sound causes frame or line skips.
Post by: Me-Myself-And-I on October 15, 2023, 03:58:39 am
I'm having a problem with a function I made and I was wondering if anyone could help me figure out the problem.I have a file called playsound.h,and a .cpp file for that. When the function runs,a sound plays as wanted but it causes a problem. I'm not sure if it causes a lag or a line skip,or a frame skip or what.All I know is that it causes image skips and it causes the program to get its variables all messed up so I assume it has something to do with skipping some code. So the question is" Why does it do this?".


playsound.h

#pragma once
#include <SFML\Graphics.hpp>
#include <SFML/Audio.hpp>
using namespace sf;
#include <string>
using namespace std;


extern Sound channel[50];
extern SoundBuffer noise[50];
extern string lastsound[50];
void playsound(int channelnumber,string soundDirectory);



playsound.cpp

#include <SFML\Audio.hpp>
using namespace sf;
#include "playsound.h"
#include <string>
using namespace std;

Sound channel[50];
SoundBuffer noise[50];
string lastsound[50];

void playsound(int channelnumber,string soundDirectory)
{

        if(soundDirectory!=lastsound[channelnumber])
        {
                noise[channelnumber].loadFromFile(soundDirectory);
                channel[channelnumber].setBuffer(noise[channelnumber]);

                if(channel[channelnumber].getStatus()!=Sound::Playing)
                {
                        channel[channelnumber].play();
                        lastsound[channelnumber]=soundDirectory;
                }
        }
        if(channel[channelnumber].getStatus()!=Sound::Playing)
        {
                lastsound[channelnumber]="";
        }
}

 

Title: Re: Playing sound causes frame or line skips.
Post by: Hapax on October 16, 2023, 12:20:35 pm
It looks like you're loading the sound from a file every time you ask it to play it. This (file access and moving around large pieces of memory) could be causing some slow-down.

It's mostly better to load all of the sound buffers first, then just assign them to sounds when you need to play them.
Title: Re: Playing sound causes frame or line skips.
Post by: Me-Myself-And-I on October 17, 2023, 07:54:14 pm
I only played the sound once and the function only loads the file once every start. Could that alone be too much to handle?

Update:
I tried it without using any arrays and theres no change.
Title: Re: Playing sound causes frame or line skips.
Post by: Hapax on October 18, 2023, 11:54:57 am
Another issue here is globals. Keeping SFML things (especially things like heavy resources such as sound buffers) should never be global. There are technical reasons for this with these objects but it's good practice to avoid this with everything if possible.
Title: Re: Playing sound causes frame or line skips.
Post by: kojack on October 18, 2023, 11:28:08 pm
The part that seems most important to me is "it causes the program to get its variables all messed up". That sounds like memory corruption, depending on what exactly messed up implies.
Title: Re: Playing sound causes frame or line skips.
Post by: Me-Myself-And-I on October 19, 2023, 04:45:26 pm
I'm thinkin it gets the variables messed up because it causes large variable changing sections of code to be skipped.I tried making it local but that didn't work.I did however find out that moving that calling function fixes it.It would be good though to know why this changes anything.
So I moved it directly past the function it was skipping the rest of.
       


bool click(int left,int top,int width,int height)
{
                if(Mouse::isButtonPressed(Mouse::Left))
                {
                       
                        if(IntRect(left,top,width,height).contains(MPosition.x,MPosition.y))
                        {
                                if(released)
                                {
                                        released=false;
                                       
                                       
                                        //playsound() was here
                                       
                                       
                                        return true;
                                }
                        }
                        else
                        {
                                if(released)
                                {
                                       
                                       
                                }
                        }
                       
                        released=false;
                       
                }
                else
                {
                        released=true;
                        return false;
                       
                }
       
}      

void loop()
{
       
        MPosition=window.mapPixelToCoords(Mouse::getPosition(window));
       
        if(room==1)
        {
                if(leave)
                        tback.loadFromFile("1.png");
                leave=false;
       
                if(click(501,256,104,54))//click function
                {
                        playsound(0,"room.wav");//moved to here
                        room=2;
                        leave=true;
                }
               
        }
}