📄 umc_audio_buffer.cpp
字号:
/*//// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright (c) 2005 Intel Corporation. All Rights Reserved.////*/#include "umc_audio_buffer.h"#include "umc_automatic_mutex.h"#include "vm_time.h"namespace UMC{AudioBuffer::AudioBuffer(void){ m_MediaPortion.SetTime(-1.0); m_MediaPortion.SetBufferPointer(NULL, 0);} // AudioBuffer::AudioBuffer(void)AudioBuffer::~AudioBuffer(void){ Close();} // AudioBuffer::AudioBuffer(void)Status AudioBuffer::LockInputBuffer(MediaData* in){ AutomaticMutex guard(m_synchro); // check error(s) if (NULL == in) return UMC_NULL_PTR; // working case if ((0.0 <= in->GetTime()) || (0.0 <= m_MediaPortion.GetTime())) { // start new portion if (0.0 <= in->GetTime()) { Status umcRes; // store current portion if (0.0 <= m_MediaPortion.GetTime()) { umcRes = SampleBuffer::UnLockInputBuffer(&m_MediaPortion); if (UMC_OK != umcRes) return umcRes; } // set negative time for new allocation m_MediaPortion.SetTime(-1.0); } // continue portion else { // set pointer and available byte(s) in->SetBufferPointer((vm_byte *) m_MediaPortion.GetBufferPointer() + m_MediaPortion.GetDataSize(), m_MediaPortion.GetBufferSize() - m_MediaPortion.GetDataSize()); VM_ASSERT((int)m_MediaPortion.GetBufferSize() - (int)m_MediaPortion.GetDataSize() > 0); in->SetDataSize(0); } } // allocate memory for new portion if (0.0 > m_MediaPortion.GetTime()) { Status umcRes; int deadlock_count = 0; // lock new memory space //do //{ umcRes = SampleBuffer::LockInputBuffer(&m_MediaPortion); //if(umcRes != UMC_OK) //{ // vm_time_sleep(1); //} //deadlock_count++; //}while(umcRes != UMC_OK && deadlock_count < 5); if (UMC_OK != umcRes) return umcRes; // prevent error(s) if(0.0 > in->GetTime()) m_MediaPortion.SetTime(-1.0); else m_MediaPortion.SetTime(in->GetTime()); // set pointer and available byte(s) in->SetBufferPointer((vm_byte *) m_MediaPortion.GetBufferPointer(), m_MediaPortion.GetBufferSize()); in->SetDataSize(0); } return UMC_OK;} // Status AudioBuffer::LockInputBuffer(MediaData* in)Status AudioBuffer::UnLockInputBuffer(MediaData* in, Status StreamStatus){ AutomaticMutex guard(m_synchro); // check error(s) if (NULL == in) return SampleBuffer::UnLockInputBuffer(in, StreamStatus); if ((NULL == m_MediaPortion.GetBufferPointer()) || (m_MediaPortion.GetBufferSize() - m_MediaPortion.GetDataSize() < in->GetDataSize())) return UMC_OPERATION_FAILED; // skip sample, wait for valid PTS if ((0.0 > in->GetTime()) && (0.0 > m_MediaPortion.GetTime())) return UMC_OK; // update data counter m_MediaPortion.SetDataSize(m_MediaPortion.GetDataSize() + in->GetDataSize()); if (UMC_END_OF_STREAM == StreamStatus) { SampleBuffer::UnLockInputBuffer(&m_MediaPortion, StreamStatus); m_MediaPortion.SetTime(-1.0); } return UMC_OK;} // Status AudioBuffer::UnLockInputBuffer(MediaData* in, Status StreamStatus)Status AudioBuffer::Close(void){ m_MediaPortion.SetTime(-1.0); m_MediaPortion.SetBufferPointer(NULL, 0); return SampleBuffer::Close();} // Status AudioBuffer::Close(void)Status AudioBuffer::Reset(void){ m_MediaPortion.SetTime(-1.0); m_MediaPortion.SetBufferPointer(NULL, 0); return SampleBuffer::Reset();} // Status AudioBuffer::Reset(void)} // namespace UMC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -