Player object and memory
Peter T. Evensen
pevensen at siboneylg.com
Thu Mar 9 12:31:32 EST 2006
I am trying to play a sequence of MP3s. I am using 3 interleaved players
to speed up the transition between the sounds. I set up the first 3 sounds
on Player 1 - Player 3. I then start Player 1 and when I get a playStopped
message, I start Player 2 and set the filename for Player 1 to the next
sound file for that player (if there is one). Is there any memory
management issues I need to be aware of? My stack freezes eventually on
XP, both as a standalone, and in the IDE.
I am doing this under Rev 2.6.1, but it also happens on 2.7. In watching
the messages, it freezes right after a startPlaying mesage is sent (but no
sound plays, and I get a watch cursor and have to force quit Rev). It
doesn't freeze right away, but only after I have played a (seeming
variable) number sound sequences.
Is this a bug? Do I need to manually free any resources? I haven't tested
it most on Mac OS X, but I haven't seen it freeze on there.
In putting in copious puts to a field, before it freezes, there is a long
pause when I set the next filename in QueueNext. This happens after I
start the next player whose sound does NOT play.
I have a group setup to contain the players. I originally had the code
attached to each player and had the same result. I have generalized my
code and moved it to the group script. My group script is the following
(perhaps someone can see a problem):
function NextPlayerNumber pName
put word 2 of pName into tPlayerNumber
put tPlayerNumber + 1 into tPlayerNumber
if tPlayerNumber > the number of players of me then put 1 into tPlayerNumber
return tPlayerNumber
end NextPlayerNumber
on playStopped
put NextPlayerNumber(the short name of the target) into tNextPlayer
if the cpDone of player ("Player" && tNextPlayer) of me is not true then
start player ("Player" && tNextPlayer) of me
QueueNext
else
StoppedReading
end if
end playStopped
on QueueNext
put the cpSoundList of the target into tCurrentSoundList
if tCurrentSoundList is not empty then
if there is no file the first item of tCurrentSoundList then
ReportError "Cannot find file:" && the first item of
tCurrentSoundList, "Missing Sound File"
set the cpDone of the target to true
else
lock messages
set the filename of the target to the first item of tCurrentSoundList
unlock messages
delete item 1 of tCurrentSoundList
set the cpSoundList of the target to tCurrentSoundList
end if
else
set the cpDone of the target to true
end if
end QueueNext
on SetSoundFiles pSoundFileList
put the number of players in me into tNumPlayers
-- split up the list among the players, interleaving the sounds
repeat with i = 1 to the number of items in pSoundFileList
put (i - 1) mod tNumPlayers + 1 into tPlayerNumber
put tPlayerList[tPlayerNumber] & item i of pSoundFileList & "," into
tPlayerList[tPlayerNumber]
end repeat
-- queue up the first sound file for each
lock messages
repeat with i = 1 to tNumPlayers
if there is no file the first item of tPlayerList[i] then
ReportError "Cannot find file:" && the first item of tPlayerList[i],
"Missing Sound File"
set the cpDone of player ("Player" && i) to true
else
set the filename of player ("Player" && i) to the first item of
tPlayerList[i]
delete the first item of tPlayerList[i]
set the cpSoundList of player ("Player" && i) to tPlayerList[i]
set the cpDone of player ("Player" && i) to false
end if
end repeat
unlock messages
end SetSoundFiles
on StartPlaying
start player "Player 1" of me
end StartPlaying
Peter T. Evensen
http://www.PetersRoadToHealth.com
314-629-5248 or 888-628-4588
More information about the use-livecode
mailing list