diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index 7f747c2eca7423591d4ad2eae87cc50c40e6ec7c..6c97a64ed7080d9284f207d7b4931857b4a4ac68 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -571,7 +571,8 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 				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;
 			}
@@ -586,11 +587,16 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 				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
@@ -599,7 +605,8 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
 					}
 					else
 					{
-						llinfos << "Vorbis decode failed!!!" << llendl;
+						adp->setHasCompletedDecode(true);
+						llinfos << "Vorbis decode failed for " << mCurrentDecodep->getUUID() << llendl;
 					}
 					mCurrentDecodep = NULL;
 				}
@@ -667,16 +674,19 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
 	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;
 }
 
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 5fa28cb90254935db97094f515481b1a2754d0aa..72c0091d17cefb1275be2d622f360fe2ffd07e2a 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -1221,10 +1221,11 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
 		// 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
@@ -1237,6 +1238,7 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E
         }
 		else
 		{
+			// llinfos << "Got asset callback with good audio data for " << uuid << ", making decode request" << llendl;
 			adp->setHasValidData(true);
 		    adp->setHasLocalData(true);
 		    gAudioDecodeMgrp->addDecodeRequest(uuid);
@@ -1304,16 +1306,18 @@ void LLAudioSource::update()
 
 	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 ;
 			}
 		}
@@ -1731,6 +1735,7 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
 	mBufferp(NULL),
 	mHasLocalData(false),
 	mHasDecodedData(false),
+	mHasCompletedDecode(false),
 	mHasValidData(true)
 {
 	if (uuid.isNull())
@@ -1742,12 +1747,13 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
 	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);
 	}
 }
 
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 28b69e19739bfda0550fb6ed433144bb0007c21f..df1e4dc3058c4fc207c03ed95c15a4737b17b7bb 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -372,10 +372,12 @@ class LLAudioData
 
 	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.
@@ -383,9 +385,10 @@ class LLAudioData
 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
 };