//////////////////////////////////////////////////////////////////////////// /// /// 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; }
BSONObj LockerImpl::reportState() { BSONObjBuilder b; reportState(&b); return b.obj(); }