Hi there!
I've never used this library before so forgive me if I say something wrong.
From your code, my interpretation is that if the button is pressed (buttonState==HIGH), the system will check if the audio is initialized and the file is set correctly. If it is, it will then start to play. This loop portion will happen every so many milliseconds so it does appear that the audio file will restart every so many seconds. What you can try to do is add a small nested loop inside your main loop that checks if the button is pushed. Perhaps something like the following:
.....//Your initialization code and such here
SdPlay.Play();
buttonState = digitalRead(buttonPin);
while(buttonState==HIGH)
{
buttonState = digitalRead(buttonPin);
if(buttonState == HIGH)
{
}
else
{
break;
}
}
This code should keep the main loop from exiting until the button is released, at which point the "deInit() function will be called and the audio should stop.
Let me know if this works!