bsptemplate/asspandvariant/template_variant/specific/soundsc_tx.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // template\template_variant\specific\soundsc_tx.cpp
       
    15 // Implementation of the Template playback shared chunk sound physical device driver (PDD).
       
    16 // This file is part of the Template Base port
       
    17 // 
       
    18 //
       
    19 
       
    20 /**
       
    21  @file
       
    22 */
       
    23 
       
    24 #include "soundsc_plat.h"
       
    25 
       
    26 // TO DO: (mandatory)
       
    27 // Declare a name for this driver. The format of this name should be
       
    28 // "SoundSc.xxxx" where xxxx is the variant name.
       
    29 _LIT(KSoundScPddName,"SoundSc.Template");
       
    30 
       
    31 // Definitions for the kernel thread created for this sound driver.
       
    32 _LIT(KSoundScDriverThreadName,"SoundDriverThread");
       
    33 const TInt KSoundScDriverThreadPriority=26;				// One less than DFC thread 0
       
    34 
       
    35 /**
       
    36 Define a function at ordinal 0 which returns a new instance of a DPhysicalDevice-derived factory class.
       
    37 */
       
    38 DECLARE_STANDARD_PDD()
       
    39 	{
       
    40 	return new DTemplateSoundScPddFactory;
       
    41 	}
       
    42 
       
    43 /**
       
    44 Constructor for the shared chunk sound PDD factory class.
       
    45 */
       
    46 DTemplateSoundScPddFactory::DTemplateSoundScPddFactory()
       
    47 	{	
       
    48 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScPddFactory::DTemplateSoundScPddFactory"));
       
    49 
       
    50 //	iDfcQ=NULL;
       
    51 	
       
    52 	// Support units KSoundScTxUnit0 & KSoundScRxUnit0.
       
    53     iUnitsMask=(1<<KSoundScRxUnit0)|(1<<KSoundScTxUnit0);
       
    54 
       
    55     // Set version number for this device.
       
    56 	iVersion=RSoundSc::VersionRequired();
       
    57 	}
       
    58 
       
    59 /**
       
    60 Destructor for the shared chunk sound PDD factory class.
       
    61 */
       
    62 DTemplateSoundScPddFactory::~DTemplateSoundScPddFactory()
       
    63 	{
       
    64 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScPddFactory::~DTemplateSoundScPddFactory"));
       
    65 	
       
    66 	// Destroy the kernel thread.
       
    67 	if (iDfcQ)
       
    68 		iDfcQ->Destroy();
       
    69 	}
       
    70 	
       
    71 /**
       
    72 Second stage constructor for the shared chunk sound PDD factory class.
       
    73 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
    74 */
       
    75 TInt DTemplateSoundScPddFactory::Install()
       
    76 	{
       
    77 	TInt r=KErrNone;
       
    78 	if (iDfcQ==NULL)
       
    79 		{
       
    80 		// Create a new sound driver DFC queue (and associated kernel thread). 
       
    81 		r=Kern::DynamicDfcQCreate(iDfcQ,KSoundScDriverThreadPriority,KSoundScDriverThreadName);
       
    82 		}
       
    83 	
       
    84 	if (r==KErrNone)
       
    85 		{
       
    86 		r=SetName(&KSoundScPddName); 				// Set the name of the driver object
       
    87 		}
       
    88 	
       
    89 	__KTRACE_SND(Kern::Printf("<DTemplateSoundScPddFactory::Install - %d",r));
       
    90 	return(r);
       
    91 	}
       
    92 	
       
    93 /**
       
    94 Returns the PDD's capabilities. This is not used by the Symbian OS device driver framework
       
    95 or by the LDD.
       
    96 @param aDes A descriptor to write capabilities information into
       
    97 */
       
    98 void DTemplateSoundScPddFactory::GetCaps(TDes8& /*aDes*/) const
       
    99 	{}
       
   100 
       
   101 /**
       
   102 Called by the kernel's device driver framework to check if this PDD is suitable for use
       
   103 with a logical channel.
       
   104 This is called in the context of the client thread which requested the creation of a logical
       
   105 channel - through a call to RBusLogicalChannel::DoCreate().
       
   106 The thread is in a critical section.
       
   107 @param aUnit The unit argument supplied by the client to RBusLogicalChannel::DoCreate().
       
   108 @param aInfo The info argument supplied by the client to RBusLogicalChannel::DoCreate() - not used.
       
   109 @param aVer The version number of the logical channel which will use this physical channel. 
       
   110 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   111 */
       
   112 TInt DTemplateSoundScPddFactory::Validate(TInt aUnit, const TDesC8* /*aInfo*/, const TVersion& aVer)
       
   113 	{
       
   114 	// Check that the version specified is compatible.
       
   115 	if (!Kern::QueryVersionSupported(RSoundSc::VersionRequired(),aVer))
       
   116 		return(KErrNotSupported);
       
   117 	
       
   118 	// Check the unit number is compatible
       
   119 	if (aUnit!=KSoundScTxUnit0 && aUnit!=KSoundScRxUnit0)
       
   120 		return(KErrNotSupported);
       
   121 		
       
   122 	return(KErrNone);
       
   123 	}
       
   124 
       
   125 /**
       
   126 Called by the kernel's device driver framework to create a physical channel object.
       
   127 This is called in the context of the client thread which requested the creation of a logical
       
   128 channel - through a call to RBusLogicalChannel::DoCreate().
       
   129 The thread is in a critical section.
       
   130 @param aChannel Set by this function to point to the created physical channel object.
       
   131 @param aUnit The unit argument supplied by the client to RBusLogicalChannel::DoCreate().
       
   132 @param aInfo The info argument supplied by the client to RBusLogicalChannel::DoCreate().
       
   133 @param aVer The version number of the logical channel which will use this physical channel. 
       
   134 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   135 */
       
   136 TInt DTemplateSoundScPddFactory::Create(DBase*& aChannel, TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& /*aVer*/)
       
   137 	{
       
   138 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScPddFactory::Create"));
       
   139 
       
   140 	// Create the appropriate PDD channel object.
       
   141 	TInt r=KErrNoMemory;
       
   142 	if (aUnit==KSoundScRxUnit0)
       
   143 		{
       
   144 		// Create a record PDD channel object
       
   145 		DTemplateSoundScRxPdd* pD=new DTemplateSoundScRxPdd;
       
   146 		aChannel=pD;
       
   147 		if (pD)
       
   148 			{
       
   149 			pD->iPhysicalDevice=this;
       
   150 			r=pD->DoCreate();
       
   151 			}
       
   152 		}
       
   153 		
       
   154 	else
       
   155 		{
       
   156 		// Create a playback PDD channel object
       
   157 		DTemplateSoundScTxPdd* pD=new DTemplateSoundScTxPdd;
       
   158 		aChannel=pD;
       
   159 		if (pD)
       
   160 			{
       
   161 			pD->iPhysicalDevice=this;
       
   162 			r=pD->DoCreate();
       
   163 			}
       
   164 		}
       
   165 	return(r);
       
   166 	}
       
   167 
       
   168 
       
   169 /**
       
   170 Constructor for the Template playback shared chunk sound driver physical device driver (PDD).
       
   171 */
       
   172 DTemplateSoundScTxPdd::DTemplateSoundScTxPdd()
       
   173 	{		
       
   174 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::DTemplateSoundScTxPdd"));
       
   175 	
       
   176 //	iDmaChan=NULL;
       
   177 //	iPendingPlay=0;
       
   178 //	iFlag=0;
       
   179 	}
       
   180 	
       
   181 /**
       
   182 Destructor for the Template playback shared chunk sound driver physical device driver (PDD).
       
   183 */
       
   184 DTemplateSoundScTxPdd::~DTemplateSoundScTxPdd()
       
   185 	{
       
   186 	// Delete the DMA request objects
       
   187 	for (TInt i=0; i<KTemplateMaxTxDmaRequests; i++)
       
   188 		{
       
   189 		if (iDmaRequest[i])
       
   190 			delete iDmaRequest[i];
       
   191 		}
       
   192 	
       
   193 	// Close the DMA channel.
       
   194 	if (iDmaChannel)
       
   195 		iDmaChannel->Close();
       
   196 	}
       
   197 	
       
   198 /**
       
   199 Second stage constructor for the Template playback shared chunk sound driver physical device driver (PDD).
       
   200 Note that this constructor is called before the second stage constructor for the LDD so it is not
       
   201 possible to call methods on the LDD here.
       
   202 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   203 */	
       
   204 TInt DTemplateSoundScTxPdd::DoCreate()
       
   205 	{
       
   206 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::DoCreate"));
       
   207 		
       
   208 	SetCaps();								// Setup the capabilities of this device.
       
   209 	
       
   210 	// Setup a DMA channel for playback
       
   211 	// TO DO: (mandatory)
       
   212 	// Setup the DMA channel information for this play device.
       
   213 	TDmaChannel::SCreateInfo info;
       
   214 //	info.iCookie=???
       
   215 	info.iDfcQ=DfcQ(KSoundScTxUnit0);
       
   216 //	info.iDfcPriority=???
       
   217 	info.iDesCount=KTemplateMaxTxDmaRequests;
       
   218 	// coverity[uninit_use_in_call]
       
   219 	// The values info.iCookie and info.iDfcPriority are to be initialized when implemented
       
   220 	TInt r=TDmaChannel::Open(info,iDmaChannel);
       
   221 	
       
   222 	// Create the DMA request objects for use with the DMA channel.
       
   223 	if (r==KErrNone)
       
   224 		{
       
   225 		for (TInt i=0; i<KTemplateMaxTxDmaRequests; i++)
       
   226 			{
       
   227 			iDmaRequest[i] = new DTemplateSoundScTxDmaRequest(*iDmaChannel,this);
       
   228 			if (iDmaRequest[i] == NULL)
       
   229 				{
       
   230 				r=KErrNoMemory;
       
   231 				break;
       
   232 				}
       
   233 			}
       
   234 		}
       
   235 	
       
   236 	__KTRACE_SND(Kern::Printf("<DTemplateSoundScTxPdd::DoCreate - %d",r));
       
   237 	return(r);
       
   238 	}
       
   239 	
       
   240 /**
       
   241 Return the DFC queue to be used by this playback device.
       
   242 @return The DFC queue to use.
       
   243 */	
       
   244 TDfcQue* DTemplateSoundScTxPdd::DfcQ(TInt /*aUnit*/)
       
   245 	{
       
   246 	return(iPhysicalDevice->iDfcQ);
       
   247 	}
       
   248 		
       
   249 /** 
       
   250 Called from the LDD to return the shared chunk create information to be used by this play device.
       
   251 @param aChunkCreateInfo A chunk create info. object to be to be filled with the settings
       
   252 						required for this device.
       
   253 */		
       
   254 void DTemplateSoundScTxPdd::GetChunkCreateInfo(TChunkCreateInfo& aChunkCreateInfo)
       
   255 	{
       
   256 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::GetChunkCreateInfo"));
       
   257 
       
   258 	// TO DO: (mandatory)
       
   259 	// Setup the shared chunk create information in aChunkCreateInfo for this play device.
       
   260 	aChunkCreateInfo.iType=TChunkCreateInfo::ESharedKernelMultiple;
       
   261 //	aChunkCreateInfo.iMapAttr=???
       
   262 	aChunkCreateInfo.iOwnsMemory=ETrue; 				// Using RAM pages.
       
   263 	aChunkCreateInfo.iDestroyedDfc=NULL; 				// No chunk destroy DFC.
       
   264 	}
       
   265 
       
   266 /**
       
   267 Called from the LDD to return the capabilities of this device.
       
   268 @param aCapsBuf A packaged TSoundFormatsSupportedV02 object to be filled with the play
       
   269 				capabilities of this device. This descriptor is in kernel memory and can be accessed directly.
       
   270 @see TSoundFormatsSupportedV02.
       
   271 */
       
   272 void DTemplateSoundScTxPdd::Caps(TDes8& aCapsBuf) const
       
   273 	{
       
   274 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::Caps"));
       
   275 	
       
   276 	// Copy iCaps back.
       
   277 	TPtrC8 ptr((const TUint8*)&iCaps,sizeof(iCaps));
       
   278 	aCapsBuf.FillZ(aCapsBuf.MaxLength());
       
   279 	aCapsBuf=ptr.Left(Min(ptr.Length(),aCapsBuf.MaxLength()));		
       
   280 	}
       
   281 
       
   282 /**
       
   283 Called from the LDD to return the maximum transfer length in bytes that this device can support in a single data transfer.
       
   284 @return The maximum transfer length in bytes.
       
   285 */
       
   286 TInt DTemplateSoundScTxPdd::MaxTransferLen() const
       
   287 	{
       
   288 	return(KTemplateMaxTxDmaTransferLen);
       
   289 	}
       
   290 
       
   291 /**
       
   292 Called from the LDD to configure or reconfigure the device using the the configuration supplied.
       
   293 @param aConfigBuf A packaged TCurrentSoundFormatV02 object which contains the new configuration settings.
       
   294 				  This descriptor is in kernel memory and can be accessed directly.
       
   295 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   296 @see TCurrentSoundFormatV02.
       
   297 */	
       
   298 TInt DTemplateSoundScTxPdd::SetConfig(const TDesC8& aConfigBuf)
       
   299 	{
       
   300 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::SetConfig"));
       
   301 	
       
   302 	// Read the new configuration from the LDD.
       
   303 	TCurrentSoundFormatV02 config;
       
   304 	TPtr8 ptr((TUint8*)&config,sizeof(config));
       
   305 	Kern::InfoCopy(ptr,aConfigBuf);
       
   306 	
       
   307 	// TO DO: (mandatory)
       
   308 	// Apply the specified audio configuration to the audio device.
       
   309 	TInt r=KErrNone;
       
   310 	
       
   311 	__KTRACE_SND(Kern::Printf("<DTemplateSoundScTxPdd::SetConfig - %d",r));
       
   312 	return(r);
       
   313 	}
       
   314 	
       
   315 /**
       
   316 Called from the LDD to set the play volume.
       
   317 @param aVolume The play volume to be set - a value in the range 0 to 255. The value 255 equates
       
   318 	to the maximum volume and each value below this equates to a 0.5dB step below it.
       
   319 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   320 */
       
   321 TInt DTemplateSoundScTxPdd::SetVolume(TInt aVolume)
       
   322 	{
       
   323 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::SetVolume"));
       
   324     
       
   325     // TO DO: (mandatory)
       
   326 	// Set the specified play volume on the audio device.
       
   327 	TInt r=KErrNone;
       
   328     
       
   329 	return(r);
       
   330 	}
       
   331 		
       
   332 /**
       
   333 Called from the LDD to prepare the audio device for playback.
       
   334 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   335 */
       
   336 TInt DTemplateSoundScTxPdd::StartTransfer()
       
   337 	{
       
   338 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::StartTransfer"));
       
   339 	
       
   340 	// TO DO: (mandatory)
       
   341 	// Prepare the audio device for playback.
       
   342 	TInt r=KErrNone;
       
   343     
       
   344     __KTRACE_SND(Kern::Printf("<DTemplateSoundScTxPdd::StartTransfer - %d",r));
       
   345     return(r);
       
   346 	}
       
   347 
       
   348 /**
       
   349 Called from the LDD to initiate the playback of a portion of data to the audio device.
       
   350 When the transfer is complete, the PDD signals this event using the LDD function PlayCallback().
       
   351 @param aTransferID A value assigned by the LDD to allow it to uniquely identify a particular transfer fragment.
       
   352 @param aLinAddr The linear address within the shared chunk of the start of the data to be played.
       
   353 @param aPhysAddr The physical address within the shared chunk of the start of the data to be played.
       
   354 @param aNumBytes The number of bytes to be played. 
       
   355 @return KErrNone if the transfer has been initiated successfully;
       
   356   		KErrNotReady if the device is unable to accept the transfer for the moment;
       
   357 		otherwise one of the other system-wide error codes.
       
   358 */
       
   359 TInt DTemplateSoundScTxPdd::TransferData(TUint aTransferID,TLinAddr aLinAddr,TPhysAddr /*aPhysAddr*/,TInt aNumBytes)
       
   360 	{
       
   361 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::TransferData(ID:%xH,Addr:%xH,Len:%d)",aLinAddr,aNumBytes));
       
   362 		
       
   363 	TInt r=KErrNone;
       
   364 	
       
   365 	// Check that we can accept the request
       
   366 	if (iPendingPlay>=KTemplateMaxTxDmaRequests)
       
   367 		r=KErrNotReady;
       
   368 	else
       
   369 		{
       
   370 		// Start a DMA transfer.
       
   371 		iDmaRequest[iFlag]->iTransferID=aTransferID;
       
   372 		iDmaRequest[iFlag]->iTransferSize=aNumBytes;
       
   373 		// TO DO: (mandatory)
       
   374 		// Supply the DMA destination information.
       
   375 		TUint32 dest=0; // ???
       
   376 		r=iDmaRequest[iFlag]->Fragment(aLinAddr,dest,aNumBytes,KDmaMemSrc|KDmaIncSrc,0);
       
   377 		if (r==KErrNone)
       
   378 			{
       
   379 			iDmaRequest[iFlag]->Queue();
       
   380 			iPendingPlay++;
       
   381 			if ((++iFlag)>=KTemplateMaxTxDmaRequests)
       
   382 				iFlag=0;
       
   383 			
       
   384 			// TO DO: (mandatory)
       
   385 			// Start the audio device transfering data.
       
   386 			}
       
   387 		}
       
   388 											
       
   389 	__KTRACE_SND(Kern::Printf("<DTemplateSoundScTxPdd::TransferData - %d",r));	
       
   390 	return(r);
       
   391 	}
       
   392 
       
   393 /**
       
   394 Called from the LDD to terminate the playback of a data to the device and to release any resources necessary for playback.
       
   395 This is called soon after the last pending play request from the client has been completed. Once this function had been
       
   396 called, the LDD will not issue any further TransferData() commands without first issueing a StartTransfer() command. 
       
   397 */
       
   398 void DTemplateSoundScTxPdd::StopTransfer()
       
   399 	{
       
   400 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::StopTransfer"));
       
   401 
       
   402     // Stop the DMA channel.
       
   403     iDmaChannel->CancelAll();
       
   404 	iFlag=0;
       
   405     iPendingPlay=0;
       
   406     
       
   407     // TO DO: (mandatory)
       
   408 	// Stop the audio device transfering data.
       
   409 	}
       
   410 
       
   411 /**
       
   412 Called from the LDD to halt the playback of data to the sound device but not to release any resources necessary for
       
   413 playback.
       
   414 If possible, any active transfer should be suspended in such a way that it can be resumed later - starting from next
       
   415 sample following the one last played.
       
   416 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   417 */
       
   418 TInt DTemplateSoundScTxPdd::PauseTransfer()
       
   419 	{
       
   420 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::PauseTransfer"));
       
   421 	
       
   422 	// TO DO: (mandatory)
       
   423 	// Halt playback on the audio device.
       
   424 	TInt r=KErrNone;
       
   425     
       
   426 	return(r);
       
   427 	}
       
   428 	
       
   429 /**
       
   430 Called from the LDD to resume the playback of data to the sound device following a request to halt playback.
       
   431 If possible, any transfer which was active when the device was halted should be resumed - starting from next sample
       
   432 following the one last played. Once complete, it should be reported using PlayCallback()
       
   433 as normal. 
       
   434 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   435 */
       
   436 TInt DTemplateSoundScTxPdd::ResumeTransfer()
       
   437 	{
       
   438 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::ResumeTransfer"));
       
   439 	
       
   440 	// TO DO: (mandatory)
       
   441 	// Resume playback on the audio device.
       
   442 	TInt r=KErrNone;
       
   443 			
       
   444 	return(r);
       
   445 	}
       
   446 
       
   447 /**
       
   448 Called from the LDD to power up the sound device when the channel is first opened and if ever the phone is brought out
       
   449 of standby mode.
       
   450 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   451 */
       
   452 TInt DTemplateSoundScTxPdd::PowerUp()
       
   453 	{
       
   454 	// TO DO: (mandatory)
       
   455 	// Power up the audio device.
       
   456 	
       
   457 	return(KErrNone);
       
   458 	}
       
   459 
       
   460 /**
       
   461 Called from the LDD to power down the sound device when the channel is closed and just before the phone powers down when
       
   462 being turned off or going into standby.
       
   463 */
       
   464 void DTemplateSoundScTxPdd::PowerDown()
       
   465 	{
       
   466 	// TO DO: (mandatory)
       
   467 	// Power down the audio device.
       
   468 	}
       
   469 	
       
   470 /**
       
   471 Called from the LDD to handle a custom configuration request.
       
   472 @param aFunction A number identifying the request.
       
   473 @param aParam A 32-bit value passed to the driver. Its meaning depends on the request.
       
   474 @return KErrNone if successful, otherwise one of the other system wide error codes.
       
   475 */
       
   476 TInt DTemplateSoundScTxPdd::CustomConfig(TInt /*aFunction*/,TAny* /*aParam*/)
       
   477 	{
       
   478 	return(KErrNotSupported);
       
   479 	}	
       
   480 
       
   481 /**
       
   482 Called from the LDD to find out how many microseconds of data have been played.  This is called
       
   483 in the context of the DFC thread.
       
   484 @param aTimeTransferred	A reference to a variable into which to place the number of microseconds of audio.
       
   485 @param aStatus			The current status of this channel
       
   486 @return KErrNone if time is valid or KErrNotSupported.
       
   487 */
       
   488 TInt DTemplateSoundScTxPdd::TimeTransferred(TInt64& aTimeTransferred, TInt aStatus)
       
   489 	{
       
   490 	return(KErrNotSupported);
       
   491 	}
       
   492 
       
   493 /**
       
   494 Called each time a playback DMA transfer completes - from the DMA callback function in the sound thread's DFC context.
       
   495 @param aTransferID The transfer ID of the DMA transfer.
       
   496 @param aTransferResult The result of the DMA transfer.
       
   497 @param aBytesTransferred The number of bytes transferred.
       
   498 */	
       
   499 void DTemplateSoundScTxPdd::PlayCallback(TUint aTransferID,TInt aTransferResult,TInt aBytesTransferred)
       
   500 	{
       
   501 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::PlayCallback"));
       
   502 	
       
   503 	iPendingPlay--;
       
   504 		
       
   505 	Ldd()->PlayCallback(aTransferID,aTransferResult,aBytesTransferred);
       
   506 	}
       
   507 
       
   508 /**
       
   509 Initialise the data member DTemplateSoundScTxPdd::iCaps with the play capabilities of this audio playback device.
       
   510 */	
       
   511 void DTemplateSoundScTxPdd::SetCaps()
       
   512 	{
       
   513 	__KTRACE_SND(Kern::Printf(">DTemplateSoundScTxPdd::SetCaps"));
       
   514 	
       
   515 	// The data transfer direction for this unit is play.
       
   516 	iCaps.iDirection=ESoundDirPlayback;
       
   517 	
       
   518 	// TO DO: (mandatory)
       
   519 	// Setup the rest of the capabilities structure DTemplateSoundScTxPdd::iCaps with the capabilities of this
       
   520 	// audio playback device.
       
   521 	}	
       
   522 
       
   523 /**
       
   524 Constructor for a shared chunk sound driver playback DMA request.
       
   525 */
       
   526 DTemplateSoundScTxDmaRequest::DTemplateSoundScTxDmaRequest(TDmaChannel& aChannel,DTemplateSoundScTxPdd* aPdd,TInt aMaxTransferSize)
       
   527 	: DDmaRequest(aChannel,DTemplateSoundScTxDmaRequest::DmaService,this,aMaxTransferSize),
       
   528 	  iPdd(aPdd)
       
   529 	{}
       
   530 	
       
   531 /**
       
   532 DMA tx service routine. Called in the sound thread's DFC context by the s/w DMA controller.
       
   533 @param aResult Status of DMA transfer.
       
   534 @param aArg Argument passed to DMA controller.
       
   535 */	
       
   536 void DTemplateSoundScTxDmaRequest::DmaService(TResult aResult, TAny* aArg)
       
   537 	{
       
   538 	__KTRACE_SND(Kern::Printf(">SndTxDmaService - %d",aResult));
       
   539 	DTemplateSoundScTxDmaRequest& req=*(DTemplateSoundScTxDmaRequest*)aArg;
       
   540 	
       
   541 	TInt res=KErrNone;
       
   542 	TInt bytesTransferred=req.iTransferSize;
       
   543 	if (aResult!=DDmaRequest::EOk)
       
   544 		{
       
   545 		res=KErrCorrupt;
       
   546 		bytesTransferred=0;
       
   547 		}
       
   548 		
       
   549 	// Inform the LDD of the result of the transfer.
       
   550 	req.iPdd->PlayCallback(req.iTransferID,res,bytesTransferred);	
       
   551 	return;
       
   552 	}
       
   553