This is a common problem. One way to detect a stalled buffer is if you don't receive any events from your audio player for some period of time before receiving the "start of play" message. Here's a simple event loop that does that. This is from memory, so it may not work exactly as is, but the concept is there.
audioPlayer.Play()
isBuffering = true
while true
msg = wait(5000, audioPlayer.GetMessagePort())
if msg <> invalid
' we have a valid message
if msg.isStatusMessage()
if msg.GetMessage() = "start of play"
' buffering was successful
isBuffering = false
end if
end if
else
' no message received in 5 seconds
if isbuffering
' handle a stalled buffering situation
end if
end if
end while