////////////////////////////////////////////////////////////////////////////
///
/// Validate the ACC status structure and squawk loudly if problems are found.
///
/// Dispite the squawking this method unconditionally returns success. This is
/// because the firmware will already have concealed the decode problems by
/// performing a soft mute.
///
/// \return CodecSuccess
///
CodecStatus_t Codec_MmeAudioSpdifin_c::ValidateDecodeContext(CodecBaseDecodeContext_t *Context)
{
	SpdifinAudioCodecDecodeContext_t *DecodeContext = (SpdifinAudioCodecDecodeContext_t *) Context;
	MME_LxAudioDecoderFrameStatus_t &Status = DecodeContext->DecodeStatus;
	ParsedAudioParameters_t *AudioParameters;
	enum eMulticomSpdifinState NewState, OldState = SpdifStatus.State;
	enum eMulticomSpdifinPC NewPC, OldPC = SpdifStatus.StreamType;
	tMMESpdifinStatus *FrameStatus = (tMMESpdifinStatus *) &Status.FrameStatus[0];
	NewState = (enum eMulticomSpdifinState) FrameStatus->CurrentState;
	NewPC = (enum eMulticomSpdifinPC) FrameStatus->PC;
	bool StatusChange = (AudioDecoderStatus.SamplingFreq != Status.SamplingFreq) ||
						(AudioDecoderStatus.DecAudioMode != Status.DecAudioMode);
	// HACK: This should bloody well be in the super-class
	AudioDecoderStatus = Status;
	if ((OldState != NewState) || (OldPC != NewPC) || StatusChange)
	{
		SpdifStatus.State = NewState;
		SpdifStatus.StreamType = NewPC;
		report(severity_info, "Codec_MmeAudioSpdifin_c::ValidateDecodeContext() New State :: %s after %d samples\n", reportState(NewState), SpdifStatus.PlayedSamples);
		report(severity_info, "Codec_MmeAudioSpdifin_c::ValidateDecodeContext() New StreamType :: [%d] %s after %d samples\n", NewPC, reportStreamType(NewPC), SpdifStatus.PlayedSamples);
		PlayerStatus_t PlayerStatus;
		PlayerEventRecord_t Event;
		void *EventUserData = NULL;
		Event.Code = EventInputFormatChanged;
		Event.Playback = Playback;
		Event.Stream = Stream;
		Event.PlaybackTime = TIME_NOT_APPLICABLE;
		Event.UserData = EventUserData;
		Event.Value[0].Pointer = this; // pointer to the component
		PlayerStatus = Player->SignalEvent(&Event);
		if (PlayerStatus != PlayerNoError)
		{
			report(severity_error, "Codec_MmeAudioSpdifin_c::ValidateDecodeContext - Failed to signal event.\n");
			return CodecError;
		}
		// END SYSFS
	}
	SpdifStatus.PlayedSamples += Status.NbOutSamples;
	NumberOfSamplesProcessed += Status.NbOutSamples; // SYSFS
	CODEC_DEBUG("Codec_MmeAudioSpdifin_c::ValidateDecodeContext() Transform Cmd returned \n");
	if (ENABLE_CODEC_DEBUG)
	{
		//DumpCommand(bufferIndex);
	}
	if (Status.DecStatus)
	{
		CODEC_ERROR("SPDIFIN audio decode error (muted frame): %d\n", Status.DecStatus);
		DecodeErrors++;
		//DumpCommand(bufferIndex);
		// don't report an error to the higher levels (because the frame is muted)
	}
	//
	// Attach any codec derived metadata to the output buffer (or verify the
	// frame analysis if the frame analyser already filled everything in for
	// us).
	//
	AudioParameters = BufferState[DecodeContext->BaseContext.BufferIndex].ParsedAudioParameters;
	// TODO: these values should be extracted from the codec's reply
	if (AudioOutputSurface)
	{
		AudioParameters->Source.BitsPerSample = AudioOutputSurface->BitsPerSample;
		AudioParameters->Source.ChannelCount = AudioOutputSurface->ChannelCount;
	}
	AudioParameters->Organisation = Status.AudioMode;
	AudioParameters->SampleCount = Status.NbOutSamples;
	enum eAccFsCode SamplingFreqCode = (enum eAccFsCode) Status.SamplingFreq;
	if (SamplingFreqCode < ACC_FS_reserved)
	{
		AudioParameters->Source.SampleRateHz = Codec_MmeAudio_c::ConvertCodecSamplingFreq(SamplingFreqCode);
		//AudioParameters->Source.SampleRateHz = 44100;
	}
	else
	{
		AudioParameters->Source.SampleRateHz = 0;
		CODEC_ERROR("SPDIFIn audio decode bad sampling freq returned: 0x%x\n", SamplingFreqCode);
	}
	if (SpdifStatus.StreamType == SPDIFIN_AC3)
	{
		Codec_MmeAudioEAc3_c::FillStreamMetadata(AudioParameters, (MME_LxAudioDecoderFrameStatus_t *)&Status);
	}
	else if (((SpdifStatus.StreamType >= SPDIFIN_DTS1) && ((SpdifStatus.StreamType <= SPDIFIN_DTS3))) ||
			 (SpdifStatus.StreamType == SPDIFIN_IEC60958_DTS14) || (SpdifStatus.StreamType == SPDIFIN_IEC60958_DTS16))
	{
		Codec_MmeAudioDtshd_c::FillStreamMetadata(AudioParameters, (MME_LxAudioDecoderFrameStatus_t *)&Status);
	}
	else
	{
		// do nothing, the AudioParameters are zeroed by FrameParser_Audio_c::Input() which is
		// appropriate (i.e. OriginalEncoding is AudioOriginalEncodingUnknown)
	}
	return CodecNoError;
}
Exemplo n.º 2
0
    BSONObj LockerImpl::reportState() {
        BSONObjBuilder b;
        reportState(&b);

        return b.obj();
    }