navienginebsp/ne1_tb/soundsc/soundsc.cpp
changeset 0 5de814552237
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/navienginebsp/ne1_tb/soundsc/soundsc.cpp	Tue Sep 28 18:00:05 2010 +0100
@@ -0,0 +1,171 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* \bsp\hwip_nec_naviengine\ne1_tb\soundsc\sound.cpp
+* Implementation of a sound physical device driver (PDD) factory
+*
+*/
+
+
+
+#include "soundsc_plat.h"
+#include <naviengine.h>
+#include <i2s.h>
+
+_LIT(KSoundScPddName,"SoundSc.NE1_TBVariant");
+
+// Definitions for the kernel thread created for this sound driver.
+_LIT(KSoundScDriverThreadName,"SoundDriverThread");
+const TInt KSoundScDriverThreadPriority=26;				// One less than DFC thread 0 (26)
+
+/**
+Define a function at ordinal 0 which returns a new instance of a DPhysicalDevice-derived factory class.
+*/
+DECLARE_STANDARD_PDD()
+	{
+	return new DSoundScPddNE1_TB;
+	}
+
+/**
+Constructor for the shared chunk sound PDD factory class.
+*/
+DSoundScPddNE1_TB::DSoundScPddNE1_TB()
+	{
+	__KTRACE_SND(Kern::Printf(">DSoundScPddNE1_TB::DSoundScPddNE1_TB"));
+
+	// Support units KSoundScTxUnit0 & KSoundScRxUnit0.
+    iUnitsMask=(1<<KSoundScRxUnit0)|(1<<KSoundScTxUnit0);
+
+    // Set version number for this device.
+	iVersion=RSoundSc::VersionRequired();
+	}
+
+/**
+Destructor for the shared chunk sound PDD factory class.
+This function is called from the client thread context.
+*/
+DSoundScPddNE1_TB::~DSoundScPddNE1_TB()
+	{
+	__KTRACE_SND(Kern::Printf(">DSoundScPddNE1_TB::~DSoundScPddNE1_TB"));
+
+	// Destroy the kernel thread.
+	if (iDfcQ)
+		{
+		iDfcQ->Destroy();
+		}
+	}
+
+/**
+Second stage constructor for the shared chunk sound PDD factory class.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt DSoundScPddNE1_TB::Install()
+	{
+	__KTRACE_SND(Kern::Printf(">DSoundScPddNE1_TB::Install"));
+	TInt r = KErrNone;
+	if (!iDfcQ)
+		{
+		// Create a new sound driver DFC queue (and associated kernel thread).
+		r = Kern::DynamicDfcQCreate(iDfcQ, KSoundScDriverThreadPriority, KSoundScDriverThreadName);
+		if (r != KErrNone)
+			{
+			return r;
+			}
+		}
+
+#ifdef CPU_AFFINITY_ANY
+	NKern::ThreadSetCpuAffinity((NThread*)(iDfcQ->iThread), KCpuAffinityAny);
+#endif
+
+	r = SetName(&KSoundScPddName); 				// Set the name of the driver object
+
+	return(r);
+	}
+
+/**
+Returns the PDD's capabilities. This is not used by the Symbian OS device driver framework
+or by the LDD.
+@param aDes A descriptor to write capabilities information into
+*/
+void DSoundScPddNE1_TB::GetCaps(TDes8& /*aDes*/) const
+	{}
+
+/**
+Called by the kernel's device driver framework to check if this PDD is suitable for use
+with a logical channel.
+This is called in the context of the client thread which requested the creation of a logical
+channel - through a call to RBusLogicalChannel::DoCreate().
+The thread is in a critical section.
+@param aUnit The unit argument supplied by the client to RBusLogicalChannel::DoCreate().
+@param aInfo The info argument supplied by the client to RBusLogicalChannel::DoCreate() - not used.
+@param aVer The version number of the logical channel which will use this physical channel.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt DSoundScPddNE1_TB::Validate(TInt aUnit, const TDesC8* /*aInfo*/, const TVersion& aVer)
+	{
+	// Check that the version specified is compatible.
+	if (!Kern::QueryVersionSupported(RSoundSc::VersionRequired(), aVer))
+		{
+		return(KErrNotSupported);
+		}
+
+	// Check the unit number is compatible
+	if (aUnit!=KSoundScTxUnit0 && aUnit!=KSoundScRxUnit0)
+		{
+		return(KErrNotSupported);
+		}
+
+	return(KErrNone);
+	}
+
+/**
+Called by the kernel's device driver framework to create a physical channel object.
+This is called in the context of the client thread which requested the creation of a logical
+channel - through a call to RBusLogicalChannel::DoCreate().
+The thread is in a critical section.
+@param aChannel Set by this function to point to the created physical channel object.
+@param aUnit The unit argument supplied by the client to RBusLogicalChannel::DoCreate().
+@param aInfo The info argument supplied by the client to RBusLogicalChannel::DoCreate().
+@param aVer The version number of the logical channel which will use this physical channel.
+@return KErrNone if successful, otherwise one of the other system wide error codes.
+*/
+TInt DSoundScPddNE1_TB::Create(DBase*& aChannel, TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& /*aVer*/)
+	{
+	__KTRACE_SND(Kern::Printf(">DSoundScPddNE1_TB::Create"));
+
+	TInt r = KErrNone;
+
+	// Create the appropriate PDD channel object.
+	DNE1_TBSoundScPddChannel* pD = NULL;
+
+	if (aUnit==KSoundScRxUnit0)
+		{
+		// Create a record PDD channel object
+		pD = new DNE1_TBSoundScPddChannel(ESoundDirRecord);
+		}
+	else
+		{
+		// Create a playback PDD channel object
+		pD = new DNE1_TBSoundScPddChannel(ESoundDirPlayback);
+		}
+
+	r = KErrNoMemory;
+	if (pD)
+		{
+		pD->iPhysicalDevice = this;
+		r = pD->DoCreate();
+		aChannel = pD;
+		}
+	return(r);
+	}