You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
473 lines
12 KiB
473 lines
12 KiB
|
|
/*
|
|
*
|
|
* This software is released under the provisions of the GPL version 2.
|
|
* see file "COPYING". If that file is not available, the full statement
|
|
* of the license can be found at
|
|
*
|
|
* http://www.fsf.org/licensing/licenses/gpl.txt
|
|
*
|
|
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
|
|
* Portions (c) Paul Cifarelli 2005
|
|
*
|
|
*
|
|
*/
|
|
#include "hxcomm.h"
|
|
#include "hxcore.h"
|
|
#include "hxbuffer.h"
|
|
#include "hxmangle.h"
|
|
|
|
#include "hxclsnk.h"
|
|
#include "hxerror.h"
|
|
#include "hxprefs.h"
|
|
|
|
#include "hspadvisesink.h"
|
|
#include "hsperror.h"
|
|
#include "hspauthmgr.h"
|
|
#include "hspcontext.h"
|
|
|
|
#include "hxausvc.h"
|
|
#include "helix-sp.h"
|
|
#include "utils.h"
|
|
|
|
extern BOOL bEnableAdviceSink;
|
|
|
|
HSPEngineContext::HSPEngineContext(HelixSimplePlayer *splayer, IHXCommonClassFactory *pCommonClassFactory) : m_lRefCount(0), m_CommonClassFactory(pCommonClassFactory), m_splayer(splayer)
|
|
{
|
|
}
|
|
|
|
HSPEngineContext::~HSPEngineContext()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
void HSPEngineContext::Close()
|
|
{
|
|
// you don't own the common class factory, so don't even think about it...
|
|
}
|
|
|
|
// *** IUnknown methods ***
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::QueryInterface
|
|
// Purpose:
|
|
// Implement this to export the interfaces supported by your
|
|
// object.
|
|
//
|
|
STDMETHODIMP HSPEngineContext::QueryInterface(REFIID riid, void** ppvObj)
|
|
{
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
{
|
|
AddRef();
|
|
*ppvObj = this;
|
|
return HXR_OK;
|
|
}
|
|
else if (IsEqualIID(riid, IID_IHXPreferences))
|
|
{
|
|
AddRef();
|
|
*ppvObj = (IHXPreferences*)this;
|
|
return HXR_OK;
|
|
}
|
|
*ppvObj = NULL;
|
|
return HXR_NOINTERFACE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::AddRef
|
|
// Purpose:
|
|
// Everyone usually implements this the same... feel free to use
|
|
// this implementation.
|
|
//
|
|
STDMETHODIMP_(ULONG32) HSPEngineContext::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_lRefCount);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::Release
|
|
// Purpose:
|
|
// Everyone usually implements this the same... feel free to use
|
|
// this implementation.
|
|
//
|
|
STDMETHODIMP_(ULONG32) HSPEngineContext::Release()
|
|
{
|
|
if (InterlockedDecrement(&m_lRefCount) > 0)
|
|
{
|
|
return m_lRefCount;
|
|
}
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
// *** IHXPreference methods ***
|
|
void HSPEngineContext::Init(IUnknown* /*pUnknown*/)
|
|
{
|
|
// nothing to do yet...
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IHXPreferences::ReadPref
|
|
// Purpose:
|
|
// Read a Preference from the registry.
|
|
//
|
|
STDMETHODIMP
|
|
HSPEngineContext::ReadPref(const char* pref_key, IHXBuffer*& buffer)
|
|
{
|
|
HX_RESULT hResult = HXR_OK;
|
|
unsigned char *outbuf;
|
|
IHXBuffer *ibuf;
|
|
|
|
|
|
m_splayer->print2stderr("in engine context, key is <%s>\n", pref_key);
|
|
if (0 == (stricmp(pref_key, "OpenAudioDeviceOnPlayback")))
|
|
{
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(2);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "0");
|
|
buffer = ibuf;
|
|
//m_splayer->print2stderr("value = %d\n",atol((const char*) buffer->GetBuffer()));
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "SoundDriver")))
|
|
{
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(2);
|
|
outbuf = ibuf->GetBuffer();
|
|
|
|
// 0 = OSS
|
|
// 1 = OldOSSsupport
|
|
// 2 = ESound
|
|
// 3 = Alsa
|
|
// 4 = USound
|
|
|
|
if (m_splayer->getOutputSink() == HelixSimplePlayer::ALSA)
|
|
strcpy((char *)outbuf, "3"); // set SoundDriver = kALSA (ie 3) for Alsa native support
|
|
else if (m_splayer->getOutputSink() == HelixSimplePlayer::OSS)
|
|
strcpy((char *)outbuf, "0"); // set SoundDriver = kOSS (ie 0) for OSS
|
|
buffer = ibuf;
|
|
|
|
if (m_splayer->getOutputSink() == HelixSimplePlayer::ALSA || m_splayer->getOutputSink() == HelixSimplePlayer::OSS)
|
|
m_splayer->print2stderr("Setting Sound System to %s\n", m_splayer->getOutputSink() == HelixSimplePlayer::ALSA ? "ALSA" : "OSS");
|
|
else
|
|
m_splayer->print2stderr("Setting Sound System to UNKNOWN: %d\n", m_splayer->getOutputSink());
|
|
}
|
|
}
|
|
// maybe also need to allow setting of "AlsaMixerDeviceName"?
|
|
else if (0 == (stricmp(pref_key, "AlsaMixerElementName")))
|
|
{
|
|
m_splayer->setAlsaCapableCore(); // this just lets everyone know that this helix core is Alsa-capable
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(11);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "PC Speaker");
|
|
buffer = ibuf;
|
|
m_splayer->print2stderr("Setting Mixer Element to use default mixer\n");
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "AlsaMixerDeviceName")))
|
|
{
|
|
m_splayer->setAlsaCapableCore(); // this just lets everyone know that this helix core is Alsa-capable
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(8);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "default");
|
|
buffer = ibuf;
|
|
m_splayer->print2stderr("Setting Mixer Device to use the \"default\" mixer\n");
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "AlsaPCMDeviceName")))
|
|
{
|
|
m_splayer->setAlsaCapableCore(); // this just lets everyone know that this helix core is Alsa-capable
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
int len = strlen(m_splayer->getDevice());
|
|
m_splayer->print2stderr("Setting Sound Device to \"%s\", %d\n", m_splayer->getDevice(), len);
|
|
ibuf->SetSize(len + 1);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, m_splayer->getDevice());
|
|
buffer = ibuf;
|
|
m_splayer->print2stderr("Setting Sound Device to \"%s\"\n", m_splayer->getDevice());
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "ThreadedAudio")))
|
|
{
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(2);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "1");
|
|
buffer = ibuf;
|
|
|
|
m_splayer->print2stderr("setting ThreadedAudio to value = %ld\n",atol((const char*) buffer->GetBuffer()));
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "UseCoreThread")))
|
|
{
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(2);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "1");
|
|
buffer = ibuf;
|
|
|
|
m_splayer->print2stderr("setting initial UseCoreThread to value = %ld\n",atol((const char*) buffer->GetBuffer()));
|
|
}
|
|
}
|
|
else if (0 == (stricmp(pref_key, "NetworkThreading")))
|
|
{
|
|
m_CommonClassFactory->CreateInstance(CLSID_IHXBuffer, (void **) &ibuf);
|
|
if (ibuf)
|
|
{
|
|
ibuf->SetSize(2);
|
|
outbuf = ibuf->GetBuffer();
|
|
strcpy((char *)outbuf, "1");
|
|
buffer = ibuf;
|
|
|
|
m_splayer->print2stderr("setting initial NetworkTheading to value = %ld\n",atol((const char*) buffer->GetBuffer()));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hResult = HXR_NOTIMPL;
|
|
}
|
|
|
|
return hResult;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IHXPreferences::WritePref
|
|
// Purpose:
|
|
// Write a Preference to the registry.
|
|
//
|
|
STDMETHODIMP
|
|
HSPEngineContext::WritePref(const char* /*pref_key*/, IHXBuffer* /*buffer*/)
|
|
{
|
|
//m_splayer->print2stderr("In EngineContext, WritePref, key %s\n", pref_key);
|
|
return HXR_OK; // for now, no one allowed to change it
|
|
}
|
|
|
|
|
|
|
|
HSPClientContext::HSPClientContext(LONG32 lClientIndex, HelixSimplePlayer *pSplay)
|
|
: m_lRefCount(0)
|
|
, m_lClientIndex(lClientIndex)
|
|
, m_pClientSink(NULL)
|
|
, m_pErrorSink(NULL)
|
|
, m_pAuthMgr(NULL)
|
|
, m_pDefaultPrefs(NULL)
|
|
, m_splayer(pSplay)
|
|
{
|
|
}
|
|
|
|
|
|
HSPClientContext::~HSPClientContext()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
void HSPClientContext::Init(IUnknown* pUnknown,
|
|
IHXPreferences* pPreferences,
|
|
char* pszGUID)
|
|
{
|
|
//char* pszCipher = NULL;
|
|
|
|
|
|
m_pClientSink = new HSPClientAdviceSink(pUnknown, m_lClientIndex, m_splayer);
|
|
m_pErrorSink = new HSPErrorSink(pUnknown, m_splayer);
|
|
m_pAuthMgr = new HSPAuthenticationManager(m_splayer);
|
|
|
|
if (m_pClientSink)
|
|
{
|
|
m_pClientSink->AddRef();
|
|
}
|
|
|
|
if (m_pErrorSink)
|
|
{
|
|
m_pErrorSink->AddRef();
|
|
}
|
|
|
|
if(m_pAuthMgr)
|
|
{
|
|
m_pAuthMgr->AddRef();
|
|
}
|
|
|
|
if (pPreferences)
|
|
{
|
|
m_pDefaultPrefs = pPreferences;
|
|
m_pDefaultPrefs->AddRef();
|
|
}
|
|
|
|
if (pszGUID && *pszGUID)
|
|
{
|
|
// Encode GUID
|
|
// TODO: find/implement Cipher
|
|
//pszCipher = Cipher(pszGUID);
|
|
//SafeStrCpy(m_pszGUID, pszCipher, 256);
|
|
}
|
|
else
|
|
{
|
|
m_pszGUID[0] = '\0';
|
|
}
|
|
}
|
|
|
|
void HSPClientContext::Close()
|
|
{
|
|
HX_RELEASE(m_pClientSink);
|
|
HX_RELEASE(m_pErrorSink);
|
|
HX_RELEASE(m_pAuthMgr);
|
|
HX_RELEASE(m_pDefaultPrefs);
|
|
}
|
|
|
|
|
|
|
|
// *** IUnknown methods ***
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::QueryInterface
|
|
// Purpose:
|
|
// Implement this to export the interfaces supported by your
|
|
// object.
|
|
//
|
|
STDMETHODIMP HSPClientContext::QueryInterface(REFIID riid, void** ppvObj)
|
|
{
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
{
|
|
AddRef();
|
|
*ppvObj = this;
|
|
return HXR_OK;
|
|
}
|
|
else if (IsEqualIID(riid, IID_IHXPreferences))
|
|
{
|
|
AddRef();
|
|
*ppvObj = (IHXPreferences*)this;
|
|
return HXR_OK;
|
|
}
|
|
else if (m_pClientSink &&
|
|
m_pClientSink->QueryInterface(riid, ppvObj) == HXR_OK)
|
|
{
|
|
return HXR_OK;
|
|
}
|
|
else if (m_pErrorSink &&
|
|
m_pErrorSink->QueryInterface(riid, ppvObj) == HXR_OK)
|
|
{
|
|
return HXR_OK;
|
|
}
|
|
else if(m_pAuthMgr &&
|
|
m_pAuthMgr->QueryInterface(riid, ppvObj) == HXR_OK)
|
|
{
|
|
return HXR_OK;
|
|
}
|
|
*ppvObj = NULL;
|
|
return HXR_NOINTERFACE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::AddRef
|
|
// Purpose:
|
|
// Everyone usually implements this the same... feel free to use
|
|
// this implementation.
|
|
//
|
|
STDMETHODIMP_(ULONG32) HSPClientContext::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_lRefCount);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IUnknown::Release
|
|
// Purpose:
|
|
// Everyone usually implements this the same... feel free to use
|
|
// this implementation.
|
|
//
|
|
STDMETHODIMP_(ULONG32) HSPClientContext::Release()
|
|
{
|
|
if (InterlockedDecrement(&m_lRefCount) > 0)
|
|
{
|
|
return m_lRefCount;
|
|
}
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
// *** IHXPreference methods ***
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IHXPreferences::ReadPref
|
|
// Purpose:
|
|
// Read a Preference from the registry.
|
|
//
|
|
STDMETHODIMP
|
|
HSPClientContext::ReadPref(const char* pref_key, IHXBuffer*& buffer)
|
|
{
|
|
HX_RESULT hResult = HXR_OK;
|
|
//char* pszCipher = NULL;
|
|
|
|
if ((stricmp(pref_key, CLIENT_GUID_REGNAME) == 0) &&
|
|
(*m_pszGUID))
|
|
{
|
|
// Create a Buffer
|
|
//TODO: Implement an IHXBuffer
|
|
|
|
// buffer = new CHXBuffer();
|
|
// buffer->AddRef();
|
|
|
|
// Copy the encoded GUID into the buffer
|
|
// buffer->Set((UCHAR*)m_pszGUID, strlen(m_pszGUID) + 1);
|
|
}
|
|
else if (m_pDefaultPrefs)
|
|
{
|
|
hResult = m_pDefaultPrefs->ReadPref(pref_key, buffer);
|
|
}
|
|
else
|
|
{
|
|
hResult = HXR_NOTIMPL;
|
|
}
|
|
|
|
return hResult;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Method:
|
|
// IHXPreferences::WritePref
|
|
// Purpose:
|
|
// Write a Preference to the registry.
|
|
//
|
|
STDMETHODIMP
|
|
HSPClientContext::WritePref(const char* pref_key, IHXBuffer* buffer)
|
|
{
|
|
if (m_pDefaultPrefs)
|
|
{
|
|
return m_pDefaultPrefs->WritePref(pref_key, buffer);
|
|
}
|
|
else
|
|
{
|
|
return HXR_OK;
|
|
}
|
|
}
|
|
|
|
|