⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chxclientplayer.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* ***** BEGIN LICENSE BLOCK ***** * Source last modified: $Id: CHXClientPlayer.cpp,v 1.25.2.5 2004/07/09 01:49:47 hubbe Exp $ *  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved. *  * The contents of this file, and the files included with this file, * are subject to the current version of the RealNetworks Public * Source License (the "RPSL") available at * http://www.helixcommunity.org/content/rpsl unless you have licensed * the file under the current version of the RealNetworks Community * Source License (the "RCSL") available at * http://www.helixcommunity.org/content/rcsl, in which case the RCSL * will apply. You may also obtain the license terms directly from * RealNetworks.  You may not use this file except in compliance with * the RPSL or, if you have a valid RCSL with RealNetworks applicable * to this file, the RCSL.  Please see the applicable RPSL or RCSL for * the rights, obligations and limitations governing use of the * contents of the file. *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL") in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your version of * this file only under the terms of the GPL, and not to allow others * to use your version of this file under the terms of either the RPSL * or RCSL, indicate your decision by deleting the provisions above * and replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient may * use your version of this file under the terms of any one of the * RPSL, the RCSL or the GPL. *  * This file is part of the Helix DNA Technology. RealNetworks is the * developer of the Original Code and owns the copyrights in the * portions it created. *  * This file, and the files included with this file, is distributed * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET * ENJOYMENT OR NON-INFRINGEMENT. *  * Technology Compatibility Kit Test Suite(s) Location: *    http://www.helixcommunity.org/content/tck *  * Contributor(s): *  * ***** END LICENSE BLOCK ***** */#include "CHXClientPlayer.h"#include "CHXClientSink.h"#include "CHXEQProcessor.h"#include "CHXClientBuffer.h"#include "CHXClientRequest.h"#include "CHXClientDataStream.h"#include "CHXFlatArray.h"#include "CHXClientDebug.h"#if defined(HELIX_FEATURE_REGISTRY) && defined(HELIX_FEATURE_STATS)#include "CHXStatisticTracker.h"#endif#ifdef HELIX_FEATURE_VIDEO#include "CHXClientSiteSupplier.h"#endif#include "enter_hx_headers.h"#include "hxfiles.h" /* IHXRequest */#include "ihxpckts.h"#include "hxcore.h"#include "hxgroup.h"#include "hxvsrc.h"#include "hxsmartptr.h"HX_SMART_POINTER_INLINE( SPIHXBuffer, IHXBuffer );HX_SMART_POINTER_INLINE( SPIHXValues, IHXValues );HX_SMART_POINTER_INLINE( SPIHXRequest, IHXRequest );HX_SMART_POINTER_INLINE( SPIHXAudioPlayer, IHXAudioPlayer );HX_SMART_POINTER_INLINE( SPIHXPlayer2, IHXPlayer2 );HX_SMART_POINTER_INLINE( SPIHXGroup, IHXGroup );HX_SMART_POINTER_INLINE( SPIHXGroupManager, IHXGroupManager );HX_SMART_POINTER_INLINE( SPIHXViewSourceCommand, IHXViewSourceCommand );HX_SMART_POINTER_INLINE( SPIHXClientViewRights, IHXClientViewRights );#include "exit_hx_headers.h"#include "HXClientConstants.h"#include "hlxclib/string.h"#include "hlxclib/stdlib.h"#include "hlxclib/ctype.h"static UINT32 const kMinimumDataSize = 3; // Enough for the old RA3 header ( ".ra" ).static const char* const kUnsupportedMimeTypes[] = { "text/html", NULL };static const char* const kProtocolMemFS = "mem://"; // XXXSEH: Access from a common header.static IHXStreamSource* const kCurrentStream = NULL;CHXClientPlayer::~CHXClientPlayer( void ){	Stop();	HX_RELEASE( m_pIOpenedRequest );	if ( m_pDataStreams )	{		CHXClientDataStream* pDataStream = NULL;		while ( m_pDataStreams->Pop( &pDataStream ) )		{			delete pDataStream;			pDataStream = NULL;		}		delete m_pDataStreams;		m_pDataStreams = NULL;	}#if defined(HELIX_FEATURE_REGISTRY) && defined(HELIX_FEATURE_STATS)	if ( m_pStatisticTracker )	{		CHXStatisticTracker::DestroyPlayerStatisticTracker( m_pStatisticTracker );		m_pStatisticTracker = NULL;	}#endif	if ( m_pEQProcessor )	{		m_pEQProcessor->UnhookAudio();		m_pEQProcessor->Release();		m_pEQProcessor = NULL;	}	HX_RELEASE( m_pIClientVolume );		// XXXSEH: There is no way to clear the client context from the Player.	HX_RELEASE( m_pClientContext );#ifdef HELIX_FEATURE_VIDEO	HX_RELEASE( m_SiteSupplier );#endif	if ( m_pClipSink )	{		SPIHXGroupManager spGroupManager = m_pIHXCorePlayer;		if ( spGroupManager.IsValid() )		{			spGroupManager->RemoveSink( m_pClipSink );		}		m_pIHXCorePlayer->RemoveAdviseSink( m_pClipSink );		m_pClipSink->Destroy();		HX_RELEASE( m_pClipSink );	}	m_pIHXClientEngine->ClosePlayer( m_pIHXCorePlayer );	m_pIHXCorePlayer->Release();	m_pIHXClientEngine->Release();}CHXClientPlayer::CHXClientPlayer( IHXClientEngine* pIHXClientEngine, IHXPlayer* pIHXPlayer )	: IHXClientPlayer()	, m_pIHXClientEngine( pIHXClientEngine )	, m_pIHXCorePlayer( pIHXPlayer )	, m_pIClientVolume( NULL )	, m_pClipSink( NULL )	, m_pClientContext( NULL )	, m_pEQProcessor( NULL )#if defined(HELIX_FEATURE_REGISTRY) && defined(HELIX_FEATURE_STATS)	, m_pStatisticTracker( NULL )#endif#ifdef HELIX_FEATURE_VIDEO	, m_SiteSupplier( NULL )#endif	, m_PendingSeekPosition( kInvalidSeekPosition )	, m_pDataStreams( NULL )	, m_pIOpenedRequest( NULL )	, m_IsActivelySeeking( false ){	CHXASSERT( m_pIHXClientEngine );	CHXASSERT( m_pIHXCorePlayer );	m_pIHXClientEngine->AddRef();	m_pIHXCorePlayer->AddRef();}boolCHXClientPlayer::Init( HXxWindow* pHXxWindow, void* userInfo, const HXClientCallbacks* pClientCallbacks ){	m_pClipSink = new CHXClientSink( m_pIHXCorePlayer, userInfo, pClientCallbacks );	m_pClipSink->AddRef();	m_pClipSink->Init();	m_pIHXCorePlayer->AddAdviseSink( m_pClipSink );	SPIHXGroupManager spGroupManager = m_pIHXCorePlayer;	if ( spGroupManager.IsValid() )	{		spGroupManager->AddSink( m_pClipSink );	}	IUnknown* pIUnkSiteSupplier = NULL;#ifdef HELIX_FEATURE_VIDEO	m_SiteSupplier = new CHXClientSiteSupplier( m_pIHXCorePlayer, pHXxWindow, userInfo, pClientCallbacks );	m_SiteSupplier->AddRef();	pIUnkSiteSupplier = m_SiteSupplier;#endif	m_pClientContext = CreateClientContext( this, pIUnkSiteSupplier, m_pClipSink->GetUnknown(), userInfo, pClientCallbacks );	m_pIHXCorePlayer->SetClientContext( m_pClientContext->GetUnknown() );	SPIHXAudioPlayer spAudioPlayer = m_pIHXCorePlayer;	if ( spAudioPlayer.IsValid() )	{		// XXXSEH: GetDeviceVolume() affects the entire application, but its effects are instant.		// GetAudioVolume() affects each player instance separately, but their effect is delayed.		//m_pIClientVolume = spAudioPlayer->GetAudioVolume();		m_pIClientVolume = spAudioPlayer->GetDeviceVolume();	}	m_pEQProcessor = new CHXEQProcessor( m_pIHXCorePlayer );	m_pEQProcessor->AddRef();	m_pEQProcessor->HookAudio();#if defined(HELIX_FEATURE_REGISTRY) && defined(HELIX_FEATURE_STATS)	m_pStatisticTracker = CHXStatisticTracker::CreatePlayerStatisticTracker( m_pIHXCorePlayer );#endif	return true; // XXXSEH: Could make this return a more relevant value.}IHXClientPlayer*CHXClientPlayer::Create( IHXClientEngine* pIHXClientEngine, IHXPlayer* pIHXPlayer, HXxWindow* pHXxWindow, void* userInfo, const HXClientCallbacks* pClientCallbacks ){	CHXClientPlayer* pClientPlayer = new CHXClientPlayer( pIHXClientEngine, pIHXPlayer );	if ( pClientPlayer )	{		if ( pClientPlayer->Init( pHXxWindow, userInfo, pClientCallbacks ) )		{			pClientPlayer->AddRef();			return pClientPlayer;		}		delete pClientPlayer;	}	return NULL;}CHXClientContext*CHXClientPlayer::CreateClientContext( IHXClientPlayer* pIClientPlayer, IUnknown* pIUnkSiteSupplier, IUnknown* pIUnkErrorSink, void* userInfo, const HXClientCallbacks* pClientCallbacks ){	CHXClientContext* pClientContext = new CHXClientContext( pIClientPlayer, pIUnkSiteSupplier, pIUnkErrorSink, userInfo, pClientCallbacks );	if ( pClientContext )	{		pClientContext->AddRef();	}	return pClientContext;}HX_RESULTCHXClientPlayer::GetHXClientEngine( IHXClientEngine** ppIClientEngine ){	if ( !ppIClientEngine ) return HXR_INVALID_PARAMETER;		*ppIClientEngine = m_pIHXClientEngine;	if ( *ppIClientEngine )	{		( *ppIClientEngine )->AddRef();		return HXR_OK;	}	return HXR_FAIL;}HX_RESULTCHXClientPlayer::GetHXPlayer( IHXPlayer** ppIPlayer ){	if ( !ppIPlayer ) return HXR_INVALID_PARAMETER;		*ppIPlayer = m_pIHXCorePlayer;	if ( *ppIPlayer )	{		( *ppIPlayer )->AddRef();		return HXR_OK;	}	return HXR_FAIL;}voidCHXClientPlayer::RemoveOpenedDataStream( void ){	if ( m_pIOpenedRequest && m_pDataStreams )	{		UINT32 numStreams = m_pDataStreams->GetCount();		for ( UINT32 index = 0; index < numStreams; ++index )		{			CHXClientDataStream* pDataStream = NULL;			m_pDataStreams->GetAt( index, &pDataStream );			CHXASSERT( pDataStream );			if ( pDataStream->GetRequest() == m_pIOpenedRequest )			{				m_pDataStreams->Remove( index );				delete pDataStream;				break;			}		}	}}HX_RESULTCHXClientPlayer::OpenRequest( IHXRequest* pIRequest ){	if ( pIRequest == m_pIOpenedRequest ) return HXR_OK;			Stop();	RemoveOpenedDataStream();	HX_RELEASE( m_pIOpenedRequest );	HX_RESULT outResult = LoadRequest( pIRequest );	if ( SUCCEEDED( outResult ) )	{		m_pIOpenedRequest = pIRequest;		m_pIOpenedRequest->AddRef();	}	return outResult;}HX_RESULTCHXClientPlayer::LoadRequest( IHXRequest* pIRequest ){	CHXASSERT( pIRequest );		m_pClientContext->ResetHasRequestedUpgradeFlag();	m_pClientContext->ClearPendingAuthentication();		HX_RESULT outResult = HXR_FAIL;	SPIHXPlayer2 spPlayer2 = m_pIHXCorePlayer;	if ( spPlayer2.IsValid() )	{		outResult = spPlayer2->OpenRequest( pIRequest );	}	else	{		const char* pURL = NULL;		pIRequest->GetURL( pURL );		outResult = m_pIHXCorePlayer->OpenURL( pURL );	}	return outResult;}boolCHXClientPlayer::IsUnsupportedMimeType( const char* pMimeType ) const{	if ( pMimeType && *pMimeType )	{		int index = 0;		while ( kUnsupportedMimeTypes[ index ] )		{			if ( 0 == strcmp( pMimeType, kUnsupportedMimeTypes[ index ] ) )			{				return true;			}			++index;		}	}	return false;}HX_RESULTCHXClientPlayer::OpenURL( const char* pURL, const char* pMimeType ){	if ( !pURL || !*pURL ) return HXR_INVALID_PARAMETER;	if ( IsUnsupportedMimeType( pMimeType ) ) return HXR_FAIL;		SPIHXRequest spRequest = new CHXClientRequest( pURL, pMimeType );	if ( !spRequest.IsValid() ) return HXR_OUTOFMEMORY;		return OpenRequest( spRequest.Ptr() );}boolCHXClientPlayer::IsRequestOpenOrPending( IHXRequest* pIRequest ) const{	const char* pURL = NULL;	pIRequest->GetURL( pURL );	if ( m_pIOpenedRequest )	{		const char* pOpenedURL = NULL;		m_pIOpenedRequest->GetURL( pOpenedURL );		if ( 0 == strcasecmp( pURL, pOpenedURL ) ) return true;	}	if ( m_pDataStreams )	{		UINT32 numStreams = m_pDataStreams->GetCount();		for ( UINT32 index = 0; index < numStreams; ++index )		{			CHXClientDataStream* pDataStream = NULL;			m_pDataStreams->GetAt( index, &pDataStream );			CHXASSERT( pDataStream );						const char* pDataURL = NULL;			pDataStream->GetRequest()->GetURL( pDataURL );						if ( 0 == strcasecmp( pURL, pDataURL ) ) return true;		}	}	return false;}boolCHXClientPlayer::FindDataStream( CHXClientDataStream* pFindDataStream, UINT32* pRecordNum ) const{	if ( m_pDataStreams )	{		UINT32 numStreams = m_pDataStreams->GetCount();		for ( UINT32 index = 0; index < numStreams; ++index )		{			CHXClientDataStream* pDataStream = NULL;			m_pDataStreams->GetAt( index, &pDataStream );			CHXASSERT( pDataStream );			if ( pDataStream == pFindDataStream )			{				if ( pRecordNum )				{					*pRecordNum = index;				}				return true;			}		}	}	return false;}HX_RESULTCHXClientPlayer::OpenData( const char* pURL, const char* pMimeType, UINT32 dataLength, bool autoPlay, void** ppOutData ){	if ( !pURL || !*pURL ) return HXR_INVALID_PARAMETER;	if ( !ppOutData ) return HXR_INVALID_PARAMETER;	if ( ( 0 < dataLength ) && ( dataLength < kMinimumDataSize ) ) return HXR_FAIL;	if ( IsUnsupportedMimeType( pMimeType ) ) return HXR_FAIL;		CHXClientDataStream* pDataStream = new CHXClientDataStream( this, pURL, pMimeType, dataLength, autoPlay );	if ( !pDataStream ) return HXR_OUTOFMEMORY;	// Can't open a data stream twice or in addition to a standard OpenURL.	HX_RESULT outResult = HXR_FAIL;	if ( !IsRequestOpenOrPending( pDataStream->GetRequest() ) )	{		outResult = HXR_OUTOFMEMORY;		if ( !m_pDataStreams )		{			m_pDataStreams = new CHXFlatArray( sizeof( pDataStream ) );		}		if (  m_pDataStreams )		{			m_pDataStreams->Push( &pDataStream );			*ppOutData = pDataStream;			return HXR_OK;		}	}	delete pDataStream;	return outResult;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -