Commits

Anonymous committed 24a7281

MAINT-862 and ER-1781 : Sounds not playing the first time. Reviewed by Kelly.

  • Participants
  • Parent commits 29143d1
  • Tags DRTVWR-153

Comments (0)

Files changed (3)

indra/llaudio/llaudiodecodemgr.cpp

 				llwarns << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << llendl;
 				mCurrentDecodep->flushBadFile();
 				LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
-				adp->setHasValidData(FALSE);
+				adp->setHasValidData(false);
+				adp->setHasCompletedDecode(true);
 				mCurrentDecodep = NULL;
 				done = TRUE;
 			}
 				if (mCurrentDecodep->finishDecode())
 				{
 					// We finished!
-					if (mCurrentDecodep->isValid() && mCurrentDecodep->isDone())
+					LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
+					if (!adp)
 					{
-						LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
-						adp->setHasDecodedData(TRUE);
-						adp->setHasValidData(TRUE);
+						llwarns << "Missing LLAudioData for decode of " << mCurrentDecodep->getUUID() << llendl;
+					}
+					else if (mCurrentDecodep->isValid() && mCurrentDecodep->isDone())
+					{
+						adp->setHasCompletedDecode(true);
+						adp->setHasDecodedData(true);
+						adp->setHasValidData(true);
 
 						// At this point, we could see if anyone needs this sound immediately, but
 						// I'm not sure that there's a reason to - we need to poll all of the playing
 					}
 					else
 					{
-						llinfos << "Vorbis decode failed!!!" << llendl;
+						adp->setHasCompletedDecode(true);
+						llinfos << "Vorbis decode failed for " << mCurrentDecodep->getUUID() << llendl;
 					}
 					mCurrentDecodep = NULL;
 				}
 	if (gAudiop->hasDecodedFile(uuid))
 	{
 		// Already have a decoded version, don't need to decode it.
+		//llinfos << "addDecodeRequest for " << uuid << " has decoded file already" << llendl;
 		return TRUE;
 	}
 
 	if (gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
 	{
 		// Just put it on the decode queue.
+		//llinfos << "addDecodeRequest for " << uuid << " has local asset file already" << llendl;
 		mImpl->mDecodeQueue.push(uuid);
 		return TRUE;
 	}
 
+	//llinfos << "addDecodeRequest for " << uuid << " no file available" << llendl;
 	return FALSE;
 }
 

indra/llaudio/llaudioengine.cpp

 		// Need to mark data as bad to avoid constant rerequests.
 		LLAudioData *adp = gAudiop->getAudioData(uuid);
 		if (adp)
-        {
+        {	// Make sure everything is cleared
 			adp->setHasValidData(false);
 			adp->setHasLocalData(false);
 			adp->setHasDecodedData(false);
+			adp->setHasCompletedDecode(true);
 		}
 	}
 	else
         }
 		else
 		{
+			// llinfos << "Got asset callback with good audio data for " << uuid << ", making decode request" << llendl;
 			adp->setHasValidData(true);
 		    adp->setHasLocalData(true);
 		    gAudioDecodeMgrp->addDecodeRequest(uuid);
 
 	if (!getCurrentBuffer())
 	{
-		if (getCurrentData())
+		LLAudioData *adp = getCurrentData();
+		if (adp)
 		{
 			// Hack - try and load the sound.  Will do this as a callback
 			// on decode later.
-			if (getCurrentData()->load() && getCurrentData()->getBuffer())
+			if (adp->load() && adp->getBuffer())
 			{
-				play(getCurrentData()->getID());
+				play(adp->getID());
 			}
-			else
+			else if (adp->hasCompletedDecode())		// Only mark corrupted after decode is done
 			{
+				llwarns << "Marking LLAudioSource corrupted for " << adp->getID() << llendl;
 				mCorrupted = true ;
 			}
 		}
 	mBufferp(NULL),
 	mHasLocalData(false),
 	mHasDecodedData(false),
+	mHasCompletedDecode(false),
 	mHasValidData(true)
 {
 	if (uuid.isNull())
 	if (gAudiop && gAudiop->hasDecodedFile(uuid))
 	{
 		// Already have a decoded version, don't need to decode it.
-		mHasLocalData = true;
-		mHasDecodedData = true;
+		setHasLocalData(true);
+		setHasDecodedData(true);
+		setHasCompletedDecode(true);
 	}
 	else if (gAssetStorage && gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND))
 	{
-		mHasLocalData = true;
+		setHasLocalData(true);
 	}
 }
 

indra/llaudio/llaudioengine.h

 
 	bool	hasLocalData() const		{ return mHasLocalData; }
 	bool	hasDecodedData() const		{ return mHasDecodedData; }
+	bool	hasCompletedDecode() const	{ return mHasCompletedDecode; }
 	bool	hasValidData() const		{ return mHasValidData; }
 
 	void	setHasLocalData(const bool hld)		{ mHasLocalData = hld; }
 	void	setHasDecodedData(const bool hdd)	{ mHasDecodedData = hdd; }
+	void	setHasCompletedDecode(const bool hcd)	{ mHasCompletedDecode = hcd; }
 	void	setHasValidData(const bool hvd)		{ mHasValidData = hvd; }
 
 	friend class LLAudioEngine; // Severe laziness, bad.
 protected:
 	LLUUID mID;
 	LLAudioBuffer *mBufferp;	// If this data is being used by the audio system, a pointer to the buffer will be set here.
-	bool mHasLocalData;
-	bool mHasDecodedData;
-	bool mHasValidData;
+	bool mHasLocalData;			// Set true if the sound asset file is available locally
+	bool mHasDecodedData;		// Set true if the sound file has been decoded
+	bool mHasCompletedDecode;	// Set true when the sound is decoded
+	bool mHasValidData;			// Set false if decoding failed, meaning the sound asset is bad
 };