First public contribution.
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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // e32test\multimedia\t_sound_api.cpp
19 @file Shared chunk sound driver API test code.
24 #include "t_soundutils.h"
26 #define CHECK(aValue) {Test(aValue);}
27 #define CHECK_NOERROR(aValue) { TInt v=(aValue); if(v) { Test.Printf(_L("Error value = %d\n"),v); Test(EFalse,__LINE__); }}
28 #define CHECK_EQUAL(aValue1,aValue2) { TInt v1=(aValue1); TInt v2=(aValue2); if(v1!=v2) { Test.Printf(_L("Error value = %d\n"),v1); Test(EFalse,__LINE__); }}
30 _LIT(KSndLddFileName,"ESOUNDSC.LDD");
31 _LIT(KSndPddFileName,"SOUNDSC.PDD");
33 RTest Test(_L("T_SOUND_API"));
34 RSoundSc TxSoundDevice;
35 RSoundSc RxSoundDevice;
37 TSoundFormatsSupportedV02Buf RecordCapsBuf;
38 TSoundFormatsSupportedV02Buf PlayCapsBuf;
39 TCurrentSoundFormatV02Buf PlayFormatBuf;
40 TCurrentSoundFormatV02Buf RecordFormatBuf;
46 /** @SYMTestCaseID PBASE-T_SOUND_API-219
47 @SYMTestCaseDesc Installing the PDD
48 @SYMTestPriority Critical
49 @SYMTestActions 1) Attempt to install the PDD (using User::LoadPhysicalDevice()).
50 2) Without un-installing it, attempt to install it a second time.
51 @SYMTestExpectedResults 1) KErrNone - PDD loads successfully.
52 2) Should fail with KErrAlreadyExists.
55 Test.Start(_L("Load sound PDD"));
56 r=User::LoadPhysicalDevice(KSndPddFileName);
62 CHECK(r==KErrNone || r==KErrAlreadyExists);
63 r=User::LoadPhysicalDevice(KSndPddFileName);
64 CHECK(r==KErrAlreadyExists);
66 /** @SYMTestCaseID PBASE-T_SOUND_API-220
67 @SYMTestCaseDesc Installing the LDD
68 @SYMTestPriority Critical
69 @SYMTestActions 1) Attempt to install the LDD (using User::LoadLogicalDevice()).
70 2) Without un-installing it, attempt to install it a second time.
71 @SYMTestExpectedResults 1) KErrNone - LDD loads successfully.
72 2) Should fail with KErrAlreadyExists.
75 Test.Next(_L("Load sound LDD"));
76 r=User::LoadLogicalDevice(KSndLddFileName);
77 CHECK(r==KErrNone || r==KErrAlreadyExists);
78 r=User::LoadPhysicalDevice(KSndPddFileName);
79 CHECK(r==KErrAlreadyExists);
85 LOCAL_C void TestSetAudioFormat()
88 Test.Printf(_L("Testing setting the audio format\r\n"));
90 /** @SYMTestCaseID PBASE-T_SOUND_API-227
91 @SYMTestCaseDesc Setting the audio configuration - channel configuration.
92 @SYMTestPriority Critical
93 @SYMTestActions Read the audio capabilities of the playback channel. For each of the possible 6 channel
94 configurations, issue a request on the playback channel to set this audio configuration.
95 @SYMTestExpectedResults Either KErrNone if the playback channel supports the channel configuration, or
96 KErrNotSupported if the playback channel does not support the channel configuration.
99 Test.Next(_L("Try to set every possible audio channel configuration"));
100 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
102 for (i=0 ; i < 6 ; i++)
104 PlayFormatBuf().iChannels = (i+1);
105 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
106 if (PlayCapsBuf().iChannels & (1<<i))
108 CHECK_NOERROR(r); // Caps reports it is supported
112 CHECK(r==KErrNotSupported); // Caps reports it is not supported
116 /** @SYMTestCaseID PBASE-T_SOUND_API-228
117 @SYMTestCaseDesc Setting the audio configuration - sample rate.
118 @SYMTestPriority Critical
119 @SYMTestActions Read the audio capabilities of the playback channel. For each of the possible 14 sample
120 rates, issue a request on the playback channel to set this audio configuration.
121 @SYMTestExpectedResults Either KErrNone if the playback channel supports the sample rate, or
122 KErrNotSupported if the playback channel does not support the sample rate.
123 @SYMREQ PREQ1073.4 */
125 Test.Next(_L("Try to set every possible sample rate"));
126 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
127 for (i=0 ; i <= (TInt)ESoundRate48000Hz ; i++)
129 PlayFormatBuf().iRate = (TSoundRate)i;
130 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
131 if (PlayCapsBuf().iRates & (1<<i))
133 CHECK_NOERROR(r); // Caps reports it is supported
137 CHECK(r==KErrNotSupported); // Caps reports it is not supported
141 /** @SYMTestCaseID PBASE-T_SOUND_API-229
142 @SYMTestCaseDesc Setting the audio configuration - audio encoding.
143 @SYMTestPriority Critical
144 @SYMTestActions Read the audio capabilities of the playback channel. For each of the possible 3 audio
145 encodings, issue a request on the playback channel to set this audio configuration.
146 @SYMTestExpectedResults Either KErrNone if the playback channel supports the audio encoding, or
147 KErrNotSupported if the playback channel does not support the audio encoding.
148 @SYMREQ PREQ1073.4 */
150 Test.Next(_L("Try to set every possible encoding"));
151 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
152 for (i=0 ; i <= (TInt)ESoundEncoding24BitPCM ; i++)
154 PlayFormatBuf().iEncoding = (TSoundEncoding)i;
155 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
156 if (PlayCapsBuf().iEncodings & (1<<i))
158 CHECK_NOERROR(r); // Caps reports it is supported
162 CHECK(r==KErrNotSupported); // Caps reports it is not supported
166 /** @SYMTestCaseID PBASE-T_SOUND_API-230
167 @SYMTestCaseDesc Setting the audio configuration - audio data format.
168 @SYMTestPriority Critical
169 @SYMTestActions Read the audio capabilities of the playback channel. For each of the possible 2 audio data
170 formats, issue a request on the playback channel to set this audio configuration.
171 @SYMTestExpectedResults Either KErrNone if the playback channel supports the audio data format, or
172 KErrNotSupported if the playback channel does not support the audio data format.
173 @SYMREQ PREQ1073.4 */
175 Test.Next(_L("Try to set every possible data format"));
176 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
177 for (i=0 ; i <= (TInt)ESoundDataFormatNonInterleaved ; i++)
179 PlayFormatBuf().iDataFormat = (TSoundDataFormat)i;
180 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
181 if (PlayCapsBuf().iDataFormats & (1<<i))
183 CHECK_NOERROR(r); // Caps reports it is supported
187 CHECK(r==KErrNotSupported); // Caps reports it is not supported
191 /** @SYMTestCaseID PBASE-T_SOUND_API-231
192 @SYMTestCaseDesc Setting the audio configuration - altering the configuration while transferring data.
193 @SYMTestPriority Critical
194 @SYMTestActions 1) Read the audio capabilities of the playback channel and apply a playback audio
195 configuration that is supported by channel. Set the play buffer configuration and
196 then start playing data from one of the buffers. While still playing, attempt to alter
197 the audio configuration of the playback channel.
198 2) Read the audio capabilities of the record channel and apply an audio record
199 configuration that is supported by channel. Set the record buffer configuration and
200 then start recording data into one of the buffers. While still recording, attempt
201 to alter the audio configuration of the record channel.
202 @SYMTestExpectedResults 1) Altering the audio configuration should fail with KErrInUse.
203 2) Altering the audio configuration should fail with KErrInUse.
204 @SYMREQ PREQ1073.4 */
206 Test.Next(_L("Try to alter the audio format while playing"));
208 // Set the audio configuration of the playback channel ready to start playing
209 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
210 if (PlayCapsBuf().iEncodings&KSoundEncoding16BitPCM)
211 PlayFormatBuf().iEncoding = ESoundEncoding16BitPCM;
213 PlayFormatBuf().iChannels = 2;
215 // find first supported rate and set the the audio configuration to use it
216 TxSoundDevice.AudioFormat(PlayFormatBuf); // Read back the current setting which must be valid.
217 for (i=0 ; i <= (TInt)ESoundRate48000Hz ; i++)
219 PlayFormatBuf().iRate = (TSoundRate)i;
220 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
221 if (PlayCapsBuf().iRates & (1<<i))
223 CHECK_NOERROR(r); // Caps reports it is supported
228 PrintConfig(PlayFormatBuf(),Test);
229 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
232 // Set the play buffer configuration.
234 TInt bufSize=BytesPerSecond(PlayFormatBuf()); // Large enough to hold 1 second of data.
235 bufSize=ValidBufferSize(bufSize,PlayCapsBuf().iRequestMinSize,PlayFormatBuf()); // Keep the buffer length valid for driver.
236 TTestSharedChunkBufConfig bufferConfig;
237 bufferConfig.iNumBuffers=3;
238 bufferConfig.iBufferSizeInBytes=bufSize;
239 bufferConfig.iFlags=0;
240 TPckg<TTestSharedChunkBufConfig> bufferConfigBuf(bufferConfig);
241 r=TxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
243 TxSoundDevice.GetBufferConfig(bufferConfigBuf);
244 PrintBufferConf(bufferConfig,Test);
245 CHECK(bufferConfig.iBufferSizeInBytes==bufSize);
248 r=MakeSineTable(PlayFormatBuf());
250 r=SetToneFrequency(660,PlayFormatBuf());
252 TPtr8 ptr(chunk.Base()+bufferConfig.iBufferOffsetList[0],bufSize);
253 WriteTone(ptr,PlayFormatBuf());
255 TxSoundDevice.PlayData(stat,bufferConfig.iBufferOffsetList[0],bufSize,KSndFlagLastSample);
257 // Check that altering the audio format while playing - fails
258 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
261 User::WaitForRequest(stat);
262 CHECK_EQUAL(stat.Int(),KErrNone);
264 Test.Next(_L("Try to alter the audio format while recording"));
266 // Set the audio configuration of the record channel ready to start recording
267 RxSoundDevice.AudioFormat(RecordFormatBuf); // Read back the current setting which must be valid.
268 if (RecordCapsBuf().iEncodings&KSoundEncoding16BitPCM)
269 RecordFormatBuf().iEncoding = ESoundEncoding16BitPCM;
270 RecordFormatBuf().iChannels = 2;
272 // find first supported rate and set the the audio configuration to use it
273 for (i=0 ; i <= (TInt)ESoundRate48000Hz ; i++)
275 RecordFormatBuf().iRate = (TSoundRate)i;
276 r=TxSoundDevice.SetAudioFormat(RecordFormatBuf);
277 if (RecordCapsBuf().iRates & (1<<i))
279 CHECK_NOERROR(r); // Caps reports it is supported
284 // Use the same shared chunk for recording
285 r=RxSoundDevice.SetBufferChunkOpen(bufferConfigBuf,chunk);
290 RxSoundDevice.RecordData(stat,length);
292 // Check that altering the audio format while recording - fails
293 r=RxSoundDevice.SetAudioFormat(RecordFormatBuf);
296 User::WaitForRequest(stat);
297 TInt retOffset=stat.Int();
300 r=RxSoundDevice.ReleaseBuffer(retOffset);
303 RxSoundDevice.CancelRecordData(); // Stop the driver from recording.
307 LOCAL_C void TestSetBufferConfig(TInt aBufferConfigFlags)
310 Test.Printf(_L("Testing setting the buffer configuration\r\n"));
312 /** @SYMTestCaseID PBASE-T_SOUND_API-232
313 @SYMTestCaseDesc Setting the buffer configuration - varying the number of buffers.
314 @SYMTestPriority Critical
315 @SYMTestActions Issue a request on the playback channel to create a shared chunk (i.e. using
316 SetBufferChunkCreate()) with a buffer configuration containing a single buffer. Attempt
317 to open the same shared chunk on the record channel (i.e. using SetBufferChunkOpen()).
318 Then close the chunk.
319 Repeat this same sequence using buffer configurations containing 2 - 8 buffers.
320 @SYMTestExpectedResults In every case the attempt to create and open the shared chunk should return KErrNone.
321 @SYMREQ PREQ1073.4 */
323 Test.Next(_L("Test creating/opening a chunk, varying the number of buffers "));
326 TTestSharedChunkBufConfig bufferConfig;
327 bufferConfig.iBufferSizeInBytes=0x7FE0; // 32K - 32 bytes
328 if (PlayCapsBuf().iRequestMinSize)
329 bufferConfig.iBufferSizeInBytes&=~(PlayCapsBuf().iRequestMinSize-1); // Assumes iRequestMinSize is same for play and record
330 TPckg<TTestSharedChunkBufConfig> bufferConfigBuf(bufferConfig);
333 for (i=1 ; i<=8 ; i++)
335 bufferConfig.iFlags=aBufferConfigFlags;
336 bufferConfig.iNumBuffers=i;
338 // Create the shared chunk on the play channel
339 r=TxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
341 TxSoundDevice.GetBufferConfig(bufferConfigBuf);
342 PrintBufferConf(bufferConfig,Test);
344 // Open the same shared chunk on the record channel
345 r=RxSoundDevice.SetBufferChunkOpen(bufferConfigBuf,chunk);
351 /** @SYMTestCaseID PBASE-T_SOUND_API-233
352 @SYMTestCaseDesc Setting the buffer configuration - varying the size of the buffers.
353 @SYMTestPriority Critical
354 @SYMTestActions Issue a request on the playback channel to create a shared chunk (i.e. using
355 SetBufferChunkCreate()) with a buffer configuration containing multiple buffers
356 each of size 32K bytes. Attempt to open the same shared chunk on the record channel
357 (i.e. using SetBufferChunkOpen()). Then close the chunk. Repeat this same sequence
358 using buffer configurations containing buffers of size 16K, 8K and 4K bytes.
359 @SYMTestExpectedResults In every case the attempt to create and open the shared chunk should return KErrNone.
360 @SYMREQ PREQ1073.4 */
362 Test.Next(_L("Test creating/opening a chunk, varying the size of the buffers "));
363 bufferConfig.iNumBuffers=4;
365 for (i=1 ; i<=8 ; i*=2)
367 bufferConfig.iFlags=aBufferConfigFlags;
368 bufferConfig.iBufferSizeInBytes=(0x8000/i);
370 // Create the shared chunk on the play channel
371 r=TxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
373 TxSoundDevice.GetBufferConfig(bufferConfigBuf);
374 PrintBufferConf(bufferConfig,Test);
376 // Open the same shared chunk on the record channel
377 r=RxSoundDevice.SetBufferChunkOpen(bufferConfigBuf,chunk);
383 // Try creating a shared chunk for the record channel specifying an illegal buffer size.
384 if (RecordCapsBuf().iRequestMinSize)
386 Test.Next(_L("Test creating a chunk, with an illegal buffer size"));
387 bufferConfig.iNumBuffers=1;
388 bufferConfig.iBufferSizeInBytes=0x1001; // 4K + 1byte
389 bufferConfig.iFlags=aBufferConfigFlags;
390 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
391 CHECK(r==KErrArgument);
395 /** @SYMTestCaseID PBASE-T_SOUND_API-234
396 @SYMTestCaseDesc Setting the buffer configuration - specifying the buffer offsets.
397 @SYMTestPriority Critical
398 @SYMTestActions Issue a request on the record channel to create a shared chunk (i.e.
399 using SetBufferChunkCreate()) with an buffer configuration containing multiple buffers
400 where the offset of each buffer is specified by the client. Perform this test repeatedly
401 with buffer offsets specified as follows:-
402 1) Valid buffer offsets
403 2) Offsets resulting on overlapping buffers
404 3) Offsets which aren't aligned with the request alignment restrictions for the device (if it has any).
405 @SYMTestExpectedResults 1) Setting the buffer configuration should return KErrNone.
406 2) Setting the buffer configuration should fail with KErrArgument.
407 3) Setting the buffer configuration should fail with KErrArgument.
408 @SYMREQ PREQ1073.4 */
410 // ***** Setting the buffer configuration - specifying the buffer offsets is not supported. *****
412 Test.Next(_L("Test creating a chunk, specifying the buffer offsets"));
414 bufferConfig.iNumBuffers=8;
415 bufferConfig.iBufferSizeInBytes=bufSize;
416 bufferConfig.iBufferOffsetList[0]=0;
417 bufferConfig.iBufferOffsetList[1]=bufSize;
418 bufferConfig.iBufferOffsetList[2]=bufSize*4;
419 bufferConfig.iBufferOffsetList[3]=bufSize*6;
420 bufferConfig.iBufferOffsetList[4]=bufSize*7;
421 bufferConfig.iBufferOffsetList[5]=bufSize*9;
422 bufferConfig.iBufferOffsetList[6]=bufSize*10;
423 bufferConfig.iBufferOffsetList[7]=bufSize*12;
424 bufferConfig.iFlags=(aBufferConfigFlags|KScFlagBufOffsetListInUse);
425 bufferConfigBuf.SetLength(sizeof(bufferConfig)); // Otherwise set shorter by previous GetBufferConfig().
426 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
428 RxSoundDevice.GetBufferConfig(bufferConfigBuf);
429 PrintBufferConf(bufferConfig,Test);
432 Test.Next(_L("Test creating a chunk, with invalid buffer offsets specified"));
434 // Firstly with 2nd buffer overlapping the 1st
436 bufferConfig.iNumBuffers=3;
437 bufferConfig.iBufferSizeInBytes=bufSize;
438 bufferConfig.iBufferOffsetList[0]=0;
439 bufferConfig.iBufferOffsetList[1]=bufSize/2;
440 bufferConfig.iBufferOffsetList[2]=bufSize*2;
441 bufferConfig.iFlags=(aBufferConfigFlags|KScFlagBufOffsetListInUse);
442 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
443 CHECK(r==KErrArgument);
446 // Now with offset of 3rd buffer not on a page boundary
447 if (RecordCapsBuf().iRequestAlignment)
450 bufferConfig.iNumBuffers=3;
451 bufferConfig.iBufferSizeInBytes=bufSize;
452 bufferConfig.iBufferOffsetList[0]=0;
453 bufferConfig.iBufferOffsetList[1]=bufSize;
454 bufferConfig.iBufferOffsetList[2]=(bufSize*2)+1;
455 bufferConfig.iFlags=(aBufferConfigFlags|KScFlagBufOffsetListInUse);
456 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
457 CHECK(r==KErrArgument);
463 LOCAL_C void TestPlay()
466 Test.Printf(_L("Testing play operation\r\n"));
468 // Close and re-open the playback channel to reset the driver.
469 TxSoundDevice.Close();
470 TInt r = TxSoundDevice.Open(KSoundScTxUnit0);
473 /** @SYMTestCaseID PBASE-T_SOUND_API-235
474 @SYMTestCaseDesc Play operation - playing without having set the buffer configuration.
475 @SYMTestPriority Critical
476 @SYMTestActions Issue a request on the playback channel to play some audio data before having set-up
477 the buffer configuration.
478 @SYMTestExpectedResults The play request should fail with KErrNotReady.
479 @SYMREQ PREQ1073.4 */
481 Test.Next(_L("Test playing without setting buffer config"));
482 TRequestStatus stat[2];
483 TxSoundDevice.PlayData(stat[0],0,0x2000); // 8K
484 User::WaitForRequest(stat[0]);
485 CHECK_EQUAL(stat[0].Int(),KErrNotReady);
487 /** @SYMTestCaseID PBASE-T_SOUND_API-236
488 @SYMTestCaseDesc Play operation - playing without having set the audio configuration.
489 @SYMTestPriority Critical
490 @SYMTestActions Setup the buffer configuration on the playback channel and then issue a request to
491 play audio data before having set-up the audio configuration
492 @SYMTestExpectedResults The play request should complete with KErrNone - with the driver using its default
493 audio configuration for the transfer.
494 @SYMREQ PREQ1073.4 */
496 Test.Next(_L("Test playing without setting audio config"));
498 // Read back the default play configuration
499 TxSoundDevice.AudioFormat(PlayFormatBuf);
500 TCurrentSoundFormatV02 playFormat=PlayFormatBuf();
501 PrintConfig(playFormat,Test);
503 // Set the play buffer configuration.
505 TInt bufSize=BytesPerSecond(PlayFormatBuf()); // Large enough to hold 1 second of data.
506 bufSize=ValidBufferSize(bufSize,PlayCapsBuf().iRequestMinSize,PlayFormatBuf()); // Keep the buffer length valid for driver.
507 TTestSharedChunkBufConfig bufferConfig;
508 bufferConfig.iNumBuffers=1;
509 bufferConfig.iBufferSizeInBytes=bufSize;
510 bufferConfig.iFlags=0;
511 TPckg<TTestSharedChunkBufConfig> bufferConfigBuf(bufferConfig);
512 r=TxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
514 TxSoundDevice.GetBufferConfig(bufferConfigBuf);
515 PrintBufferConf(bufferConfig,Test);
516 CHECK(bufferConfig.iBufferSizeInBytes==bufSize);
519 r=MakeSineTable(PlayFormatBuf());
521 r=SetToneFrequency(660,PlayFormatBuf());
523 TPtr8 ptr(chunk.Base()+bufferConfig.iBufferOffsetList[0],bufSize);
524 WriteTone(ptr,PlayFormatBuf());
525 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],bufSize,KSndFlagLastSample);
526 User::WaitForRequest(stat[0]);
527 CHECK_NOERROR(stat[0].Int());
529 /** @SYMTestCaseID PBASE-T_SOUND_API-239
530 @SYMTestCaseDesc Play operation - with invalid arguments.
531 @SYMTestPriority Critical
532 @SYMTestActions Setup the playback channel to commence playing audio data using a buffer configuration
533 containing multiple buffers. Now issue a series of transfer requests to play data where the
534 requests contain invalid request arguments as follows:-
535 1) A request with a buffer offset before the start of the first buffer.
536 2) A request with a buffer offset between buffers.
537 3) A request with a length too large for a buffer.
538 4) A request with a buffer offset that doesn't comply with the offset restrictions of
539 the driver (i.e. TSoundFormatsSupportedV02:: iRequestAlignment).
540 5) A request with a length that doesn't comply with the length restrictions of
541 the driver (i.e. TSoundFormatsSupportedV02::iRequestMinSize).
542 @SYMTestExpectedResults 1) The play request should fail with KErrArgument.
543 2) The play request should fail with KErrArgument.
544 3) The play request should fail with KErrArgument.
545 4) The play request should fail with KErrArgument.
546 5) The play request should fail with KErrArgument
547 @SYMREQ PREQ1073.4 */
549 Test.Next(_L("Test playing with invalid arguments"));
551 // With a buffer offset before the start of the buffer.
552 TxSoundDevice.PlayData(stat[0],(bufferConfig.iBufferOffsetList[0]-0x100),bufSize,KSndFlagLastSample);
553 User::WaitForRequest(stat[0]);
554 CHECK_EQUAL(stat[0].Int(),KErrArgument);
556 // With a buffer offset beyond the end of the buffer
557 TxSoundDevice.PlayData(stat[0],(bufferConfig.iBufferOffsetList[0]+bufSize+0x100),bufSize,KSndFlagLastSample);
558 User::WaitForRequest(stat[0]);
559 CHECK_EQUAL(stat[0].Int(),KErrArgument);
561 // With a length too large for the buffer
562 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],(bufSize+0x100),KSndFlagLastSample);
563 User::WaitForRequest(stat[0]);
564 CHECK_EQUAL(stat[0].Int(),KErrArgument);
566 // With a length that doesn't comply with the length restrictions of the driver
567 if (PlayCapsBuf().iRequestMinSize)
569 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],(bufSize-1),KSndFlagLastSample);
570 User::WaitForRequest(stat[0]);
571 CHECK_EQUAL(stat[0].Int(),KErrArgument);
574 // With an offset that doesn't comply with the offset restrictions of the driver
575 if (PlayCapsBuf().iRequestAlignment)
578 if (PlayCapsBuf().iRequestMinSize)
579 ln&=~(PlayCapsBuf().iRequestMinSize-1); // Keep the buffer length valid for the driver.
580 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0]+1,ln,KSndFlagLastSample);
581 User::WaitForRequest(stat[0]);
582 CHECK_EQUAL(stat[0].Int(),KErrArgument);
585 /** @SYMTestCaseID PBASE-T_SOUND_API-242
586 @SYMTestCaseDesc Play operation - play underflow detection.
587 @SYMTestPriority Critical
588 @SYMTestActions Setup the audio configuration on the playback channel and then setup the buffer
589 configuration. Issue a single request to play audio data from one of the buffers
590 (without supplying the KSndFlagLastSample flag) and wait for the request to complete.
591 @SYMTestExpectedResults The driver should successfully play the audio data supplied but the request should
592 return the error value: KErrUnderflow.
593 @SYMREQ PREQ1073.4 */
595 Test.Next(_L("Test play underflow detection"));
597 // Now set the audio configuration to a known state.
598 if (PlayCapsBuf().iEncodings&KSoundEncoding16BitPCM)
599 PlayFormatBuf().iEncoding = ESoundEncoding16BitPCM;
600 if (PlayCapsBuf().iRates&KSoundRate16000Hz)
601 PlayFormatBuf().iRate = ESoundRate16000Hz;
602 if (PlayCapsBuf().iChannels&KSoundStereoChannel)
603 PlayFormatBuf().iChannels = 2;
604 PrintConfig(PlayFormatBuf(),Test);
605 r=TxSoundDevice.SetAudioFormat(PlayFormatBuf);
608 // Reset the play buffer configuration to correspond to the audio configuration.
609 bufSize=BytesPerSecond(PlayFormatBuf()); // Large enough to hold 1 second of data (64K)
610 bufSize=ValidBufferSize(bufSize,PlayCapsBuf().iRequestMinSize,PlayFormatBuf()); // Keep the buffer length valid for driver.
611 bufferConfig.iNumBuffers=1;
612 bufferConfig.iBufferSizeInBytes=bufSize;
613 bufferConfig.iFlags=0;
614 r=TxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
616 TxSoundDevice.GetBufferConfig(bufferConfigBuf);
617 PrintBufferConf(bufferConfig,Test);
618 CHECK(bufferConfig.iBufferSizeInBytes==bufSize);
621 r=MakeSineTable(PlayFormatBuf());
623 r=SetToneFrequency(660,PlayFormatBuf());
625 ptr.Set(chunk.Base()+bufferConfig.iBufferOffsetList[0],bufSize,bufSize);
626 WriteTone(ptr,PlayFormatBuf());
627 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],bufSize);
628 User::WaitForRequest(stat[0]);
629 CHECK_EQUAL(stat[0].Int(),KErrUnderflow);
631 /** @SYMTestCaseID PBASE-T_SOUND_API-243
632 @SYMTestCaseDesc Play operation - playing multiple transfers from a single buffer.
633 @SYMTestPriority Critical
634 @SYMTestActions Setup the audio configuration on the playback channel and setup the buffer configuration
635 so the shared chunk contains just a single large buffer. Issue a pair of requests to play
636 audio data from the buffer (marking the last with the KSndFlagLastSample flag) and wait
637 for the requests to complete.
638 @SYMTestExpectedResults The driver should successfully play the audio data supplied and both requests should
639 complete with KErrNone.
640 @SYMREQ PREQ1073.4 */
642 Test.Next(_L("Test playing multiple transfers from a single buffer"));
646 if (PlayCapsBuf().iRequestMinSize)
647 len&=~(PlayCapsBuf().iRequestMinSize-1); // Keep the buffer length valid for the driver.
648 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],len);
649 TxSoundDevice.PlayData(stat[1],(bufferConfig.iBufferOffsetList[0]+len),len,KSndFlagLastSample);
650 bool brokenByPaging = false;
651 if((stat[0] != KRequestPending) || (stat[1] != KRequestPending))
653 brokenByPaging = true;
654 Test.Printf(_L("Paging gap between PlayData calls - skipping test\n"));
656 User::WaitForRequest(stat[0]);
657 if(!brokenByPaging) CHECK_NOERROR(stat[0].Int());
658 User::WaitForRequest(stat[1]);
659 if(!brokenByPaging) CHECK_NOERROR(stat[1].Int());
661 /** @SYMTestCaseID PBASE-T_SOUND_API-244
662 @SYMTestCaseDesc Play operation - tracking the count of bytes transferred.
663 @SYMTestPriority Critical
664 @SYMTestActions Setup the playback channel for playing audio data.
665 1) Reset the channel's count of bytes transferred and read back the count.
666 2) Issue a play request of known length and wait for it to complete. Now read the
667 count of bytes transferred.
668 3) Reset the channel's count of bytes transferred and read back the count.
669 @SYMTestExpectedResults 1) The count of bytes transferred should equal zero.
670 2) The count of bytes transferred should equal the length of the play request.
671 3) The count of bytes transferred should equal zero.
672 @SYMREQ PREQ1073.4 */
674 Test.Next(_L("Test tracking the number of bytes played"));
675 TxSoundDevice.ResetBytesTransferred();
676 TInt bytesPlayed=TxSoundDevice.BytesTransferred();
677 CHECK(bytesPlayed==0);
678 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],len,KSndFlagLastSample);
679 User::WaitForRequest(stat[0]);
680 CHECK_NOERROR(stat[0].Int());
681 bytesPlayed=TxSoundDevice.BytesTransferred();
682 CHECK(bytesPlayed==len);
683 TxSoundDevice.ResetBytesTransferred();
684 bytesPlayed=TxSoundDevice.BytesTransferred();
685 CHECK(bytesPlayed==0);
687 /** @SYMTestCaseID PBASE-T_SOUND_API-246
688 @SYMTestCaseDesc Play operation - testing the driver's handling of PDD play errors.
689 @SYMTestPriority Critical
690 @SYMTestActions Setup the playback channel for playing audio data. Using the CustomConfig() test mode
691 supported by the driver, induce the following errors returned from the driver PDD back
693 1) Induce a KErrTimedOut error at the start of the transfer and then issue a play request.
694 2) Induce a KErrTimedOut error once transfer has commenced and then issue a play request.
695 Once this completes, issue a further play request.
696 @SYMTestExpectedResults 1) The play request should fail immediately with KErrTimedOut (with no audible output being
698 2) The driver should output a short section of audible data before the first play request
699 fails with KErrTimedOut. However, the driver should recover from this and the second
700 play request should complete with KErrNone.
701 @SYMREQ PREQ1073.4 */
704 Test.Next(_L("Test the driver's handling of PDD play errors"));
706 // First induce an error at the start of the transfer
707 // Use an LDD test mode which induces KErrTimedOut at the start of the transfer.
708 r=TxSoundDevice.CustomConfig(KSndCustom_ForceStartTransferError);
710 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],bufSize,KSndFlagLastSample);
711 User::WaitForRequest(stat[0]);
712 CHECK_EQUAL(stat[0].Int(),KErrTimedOut);
714 // Now induce an error once transfer has commenced
715 // Use an LDD test mode which induces KErrTimedOut once transfer has commenced.
716 r=TxSoundDevice.CustomConfig(KSndCustom_ForceTransferDataError);
718 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],bufSize,KSndFlagLastSample);
719 User::WaitForRequest(stat[0]);
720 CHECK_EQUAL(stat[0].Int(),KErrTimedOut);
722 // Check that the driver recovers
723 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],bufSize,KSndFlagLastSample);
724 User::WaitForRequest(stat[0]);
725 CHECK_NOERROR(stat[0].Int());
728 /** @SYMTestCaseID PBASE-T_SOUND_API-247
729 @SYMTestCaseDesc Play operation - closing the channel cancels any play requests.
730 @SYMTestPriority Critical
731 @SYMTestActions Setup the playback channel for playing audio data. Issue a play request and
732 while this is outstanding, close the playback channel.
733 @SYMTestExpectedResults The outstanding request should complete with KErrCancel.
734 @SYMREQ PREQ1073.4 */
736 Test.Next(_L("Test that closing the channel cancels a play request"));
737 TxSoundDevice.PlayData(stat[0],bufferConfig.iBufferOffsetList[0],len,KSndFlagLastSample);
738 CHECK(stat[0]==KRequestPending);
739 TxSoundDevice.Close();
740 User::WaitForRequest(stat[0]);
741 CHECK(stat[0]==KErrCancel);
743 Test.Next(_L("Re-open the channel"));
744 r = TxSoundDevice.Open(KSoundScTxUnit0);
750 LOCAL_C void TestRecord()
753 Test.Printf(_L("Testing record operation\r\n"));
755 // Close and re-open the record channel to reset the driver.
756 RxSoundDevice.Close();
757 TInt r = RxSoundDevice.Open(KSoundScRxUnit0);
760 /** @SYMTestCaseID PBASE-T_SOUND_API-251
761 @SYMTestCaseDesc Record operation - recording without having set the buffer configuration.
762 @SYMTestPriority Critical
763 @SYMTestActions Issue a request on the record channel to record some audio data before
764 having set-up the buffer configuration.
765 @SYMTestExpectedResults The record request should fail with KErrNotReady.
766 @SYMREQ PREQ1073.4 */
768 Test.Next(_L("Test recording without setting buffer config"));
772 RxSoundDevice.RecordData(stat,length);
773 User::WaitForRequest(stat);
774 TInt retOffset=stat.Int();
775 CHECK_EQUAL(retOffset,KErrNotReady);
777 // Test releasing a buffer without setting buffer config
778 r=RxSoundDevice.ReleaseBuffer(0);
779 CHECK(r==KErrNotReady);
781 /** @SYMTestCaseID PBASE-T_SOUND_API-252
782 @SYMTestCaseDesc Record operation - recording without having set the audio configuration.
783 @SYMTestPriority Critical
784 @SYMTestActions Setup the buffer configuration on the record channel.
785 1) Issue a request to record a buffer of audio data before having set-up the audio
787 2) Release the buffer.
788 @SYMTestExpectedResults 1) The record request should complete with KErrNone - with the driver using its
789 default audio configuration for the transfer.
790 2) The request to release the buffer should return KErrNone
791 @SYMREQ PREQ1073.4 */
793 Test.Next(_L("Test recording without setting audio config"));
795 // Read back the default record configuration
796 RxSoundDevice.AudioFormat(RecordFormatBuf);
797 TCurrentSoundFormatV02 recordFormat=RecordFormatBuf();
798 PrintConfig(recordFormat,Test);
800 // Set the record buffer configuration.
802 TInt bufSize=BytesPerSecond(RecordFormatBuf()); // Large enough to hold 1 second of data.
803 bufSize=ValidBufferSize(bufSize,RecordCapsBuf().iRequestMinSize,RecordFormatBuf()); // Keep the buffer length valid for driver.
804 TTestSharedChunkBufConfig bufferConfig;
805 bufferConfig.iNumBuffers=3;
806 bufferConfig.iBufferSizeInBytes=bufSize;
807 bufferConfig.iFlags=0;
808 TPckg<TTestSharedChunkBufConfig> bufferConfigBuf(bufferConfig);
809 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
811 RxSoundDevice.GetBufferConfig(bufferConfigBuf);
812 PrintBufferConf(bufferConfig,Test);
813 CHECK(bufferConfig.iBufferSizeInBytes==bufSize);
816 RxSoundDevice.SetVolume(KSoundMaxVolume);
817 RxSoundDevice.RecordData(stat,length); // Start recording here
818 User::WaitForRequest(stat);
819 retOffset=stat.Int();
821 CHECK(length==bufSize);
822 r=RxSoundDevice.ReleaseBuffer(retOffset);
825 /** @SYMTestCaseID PBASE-T_SOUND_API-255
826 @SYMTestCaseDesc Record operation - invalid attempts to release a record buffer.
827 @SYMTestPriority Critical
828 @SYMTestActions Setup the record channel to record audio data. Issue a request to record a buffer of audio data
829 and then release the buffer.
830 1) Request to release the same buffer just released (without having re-claimed it with a
831 further record request).
832 2) Release a further buffer - specifying an illegal buffer offset for the buffer.
833 3) Stop the driver from recording (using CancelRecordData()). Now release a buffer while
834 recording is disabled.
835 @SYMTestExpectedResults 1) The request to release the buffer should fail with KErrNotFound.
836 2) The request to release the buffer should fail with KErrNotFound.
837 3) The request to release the buffer should fail with KErrNotFound.
838 @SYMREQ PREQ1073.4 */
840 // Test releasing a buffer twice
841 r=RxSoundDevice.ReleaseBuffer(retOffset);
842 CHECK(r==KErrNotFound);
844 // Test releasing an invalid buffer offset
845 r=RxSoundDevice.ReleaseBuffer(0);
846 CHECK(r==KErrNotFound);
848 // Third test case for PBASE-T_SOUND_API-255 is performed later in this function.
850 /** @SYMTestCaseID PBASE-T_SOUND_API-256
851 @SYMTestCaseDesc Record operation - record overflow detection.
852 @SYMTestPriority Critical
853 @SYMTestActions Setup the audio configuration on the record channel and then setup the buffer configuration
854 so the shared chunk contains three record buffers.
855 1) Issue a request to record a buffer of audio data (to start the driver recording).
856 2) When the request completes, release the buffer immediately.
857 3) Wait just over 2 buffer periods (i.e. the time it takes for the driver to fill 2 record
858 buffers) and then issue a further record request.
859 4) To test that the driver recovers from the overflow situation, immediately issue a further
861 @SYMTestExpectedResults 1) The record request should complete with KErrNone.
862 2) The request to release the buffer should return KErrNone.
863 3) The record request should fail with KErrOverflow.
864 4) The record request should complete with KErrNone.
865 @SYMREQ PREQ1073.4 */
867 Test.Next(_L("Test for record overflow"));
869 // Now set the audio configuration to a known state.
870 RxSoundDevice.CancelRecordData(); // Stop the driver from recording.
872 RxSoundDevice.AudioFormat(RecordFormatBuf); // Read back the current setting which must be valid.
873 if (RecordCapsBuf().iEncodings&KSoundEncoding16BitPCM)
874 RecordFormatBuf().iEncoding = ESoundEncoding16BitPCM;
875 if (RecordCapsBuf().iChannels&KSoundStereoChannel)
876 RecordFormatBuf().iChannels = 2;
878 // find first supported rate and set the the audio configuration to use it
879 for (TInt i=0 ; i <= (TInt)ESoundRate48000Hz ; i++)
881 RecordFormatBuf().iRate = (TSoundRate)i;
882 r = RxSoundDevice.SetAudioFormat(RecordFormatBuf);
883 if (RecordCapsBuf().iRates & (1<<i))
885 CHECK_NOERROR(r); // Caps reports it is supported
890 PrintConfig(RecordFormatBuf(),Test);
892 // Reset the record buffer configuration to correspond to the audio configuration.
893 bufSize=BytesPerSecond(RecordFormatBuf())/2; // Large enough to hold 0.5 seconds of data (64K)
894 bufSize=ValidBufferSize(bufSize,RecordCapsBuf().iRequestMinSize,RecordFormatBuf()); // Keep the buffer length valid for driver.
895 bufferConfig.iNumBuffers=3;
896 bufferConfig.iBufferSizeInBytes=bufSize;
897 bufferConfig.iFlags=0;
898 r=RxSoundDevice.SetBufferChunkCreate(bufferConfigBuf,chunk);
900 RxSoundDevice.GetBufferConfig(bufferConfigBuf);
901 PrintBufferConf(bufferConfig,Test);
902 CHECK(bufferConfig.iBufferSizeInBytes==bufSize);
904 // Test releasing a buffer before we have started recording
905 r=RxSoundDevice.ReleaseBuffer(bufferConfig.iBufferOffsetList[0]);
906 CHECK(r==KErrNotFound);
908 RxSoundDevice.RecordData(stat,length); // Start recording here
909 User::WaitForRequest(stat);
910 retOffset=stat.Int();
912 CHECK(length==bufSize);
913 r=RxSoundDevice.ReleaseBuffer(retOffset);
916 User::After(1100000); // Wait 2 buffer periods (1.1 seconds) for data overflow.
918 RxSoundDevice.RecordData(stat,length);
919 User::WaitForRequest(stat);
920 retOffset=stat.Int();
921 CHECK(retOffset==KErrOverflow);
923 Test.Next(_L("Test that the driver recovers from overflow"));
925 RxSoundDevice.RecordData(stat,length);
926 User::WaitForRequest(stat);
927 retOffset=stat.Int();
929 CHECK(length==bufSize);
931 /** @SYMTestCaseID PBASE-T_SOUND_API-257
932 @SYMTestCaseDesc Record operation - when client is too slow releasing buffers.
933 @SYMTestPriority Critical
934 @SYMTestActions Setup the audio configuration on the record channel and then setup the buffer configuration
935 so the shared chunk contains three record buffers. Issue a request to record a buffer of
936 audio data (to start the driver recording). When this request completes, issue a further
937 record request without releasing the first buffer.
938 @SYMTestExpectedResults The second record request should fail with KErrInUse.
939 @SYMREQ PREQ1073.4 */
941 Test.Next(_L("Test when client is too slow releasing buffers"));
943 RxSoundDevice.RecordData(stat,length);
944 User::WaitForRequest(stat);
945 TInt retOffset1=stat.Int();
946 CHECK(retOffset1==KErrInUse);
947 r=RxSoundDevice.ReleaseBuffer(retOffset);
950 /** @SYMTestCaseID PBASE-T_SOUND_API-258
951 @SYMTestCaseDesc Record operation - tracking the count of bytes transferred.
952 @SYMTestPriority Critical
953 @SYMTestActions Setup the record channel for recording audio data.
954 1) Reset the channel's count of bytes transferred and read back the count.
955 2) Issue a record request (to start the driver recording) and wait for it to complete. Immediately read the count of bytes transferred.
956 3) Reset the channel's count of bytes transferred and read back the count
957 @SYMTestExpectedResults 1) The count of bytes transferred should equal zero.
958 2) The count of bytes transferred should equal the size of a record buffer.
959 3) The count of bytes transferred should equal zero.
960 @SYMREQ PREQ1073.4 */
962 Test.Next(_L("Test tracking the number of bytes recorded"));
963 RxSoundDevice.CancelRecordData(); // Stop the driver from recording.
964 RxSoundDevice.ResetBytesTransferred();
965 TInt bytesRecorded=RxSoundDevice.BytesTransferred();
966 CHECK(bytesRecorded==0);
967 RxSoundDevice.RecordData(stat,length); // Re-start recording here
968 User::WaitForRequest(stat);
970 // Quickly check the number of bytes recorded
971 bytesRecorded=RxSoundDevice.BytesTransferred();
972 CHECK(bytesRecorded==bufSize);
974 // Now check the request was successful and release the buffer
975 retOffset=stat.Int();
977 CHECK(length==bufSize);
978 r=RxSoundDevice.ReleaseBuffer(retOffset);
981 RxSoundDevice.ResetBytesTransferred();
982 bytesRecorded=RxSoundDevice.BytesTransferred();
983 CHECK(bytesRecorded==0);
985 /** @SYMTestCaseID PBASE-T_SOUND_API-260
986 @SYMTestCaseDesc Record operation - testing the driver's handling of PDD record errors.
987 @SYMTestPriority Critical
988 @SYMTestActions Setup the record channel for recording. Using the CustomConfig() test mode supported by the driver, induce
989 the following errors returned from the driver PDD back to the LDD:-
990 1) Induce a KErrTimedOut error at the start of the transfer. Then, issue a record request to
991 start the driver recording. Once this completes, stop the channel from recording.
992 2) Induce a KErrTimedOut error once transfer has commenced. Then, issue a record request to
993 re-start the driver recording. Once this completes, issue a further record request.
994 @SYMTestExpectedResults 1) The record request should fail immediately with KErrTimedOut.
995 2) The first record request should soon fail with KErrTimedOut. However, the driver should
996 recover from this and the subsequent record request should complete with KErrNone.
997 @SYMREQ PREQ1073.4 */
1000 Test.Next(_L("Test the driver's handling of PDD record errors"));
1002 Test.Printf(_L("Induce an error at the start of the transfer.\r\n"));
1003 // Use an LDD test mode which induces KErrTimedOut at the start of the transfer.
1004 RxSoundDevice.CancelRecordData(); // Stop the driver from recording.
1005 r=RxSoundDevice.CustomConfig(KSndCustom_ForceStartTransferError);
1007 RxSoundDevice.RecordData(stat,length); // Re-start recording here
1008 User::WaitForRequest(stat);
1009 retOffset=stat.Int();
1010 CHECK(retOffset==KErrTimedOut);
1011 RxSoundDevice.CancelRecordData(); // Stop the driver from recording.
1013 Test.Printf(_L("Induce an error once transfer has commenced.\r\n"));
1014 // Use an LDD test mode which induces KErrTimedOut once transfer has commenced.
1015 r=RxSoundDevice.CustomConfig(KSndCustom_ForceTransferDataError);
1017 RxSoundDevice.RecordData(stat,length); // Re-start recording here
1018 User::WaitForRequest(stat);
1019 retOffset=stat.Int();
1020 CHECK(retOffset==KErrTimedOut);
1022 Test.Printf(_L("Check that the driver recovers.\r\n"));
1023 RxSoundDevice.RecordData(stat,length);
1024 User::WaitForRequest(stat);
1025 retOffset=stat.Int();
1026 CHECK(retOffset>=0);
1027 CHECK(length==bufSize);
1028 r=RxSoundDevice.ReleaseBuffer(retOffset);
1032 Test.Printf(_L("Induce LDD to be slow servicing transfer completes from PDD.\r\n"));
1033 r=RxSoundDevice.CustomConfig(KSndCustom_ForceTransferTimeout);
1035 RxSoundDevice.RecordData(stat,length);
1036 User::WaitForRequest(stat);
1037 retOffset=stat.Int();
1038 Test.Printf(_L("Driver returned %d.\r\n"),retOffset); */
1041 /** @SYMTestCaseID PBASE-T_SOUND_API-261
1042 @SYMTestCaseDesc Record operation - closing the channel cancels any record requests.
1043 @SYMTestPriority Critical
1044 @SYMTestActions Start the record channel for recording audio data. Issue a record request and while this is
1045 outstanding, close the record channel
1046 @SYMTestExpectedResults The outstanding request should complete with KErrCancel.
1047 @SYMREQ PREQ1073.4 */
1049 Test.Next(_L("Test that closing the channel cancels a play request"));
1050 RxSoundDevice.RecordData(stat,length);
1051 CHECK(stat==KRequestPending);
1052 RxSoundDevice.Close();
1053 User::WaitForRequest(stat);
1054 CHECK(stat==KErrCancel);
1056 Test.Next(_L("Re-open the channel"));
1057 r = RxSoundDevice.Open(KSoundScRxUnit0);
1064 LOCAL_C void TestChangeOfHwConfigNotifier()
1067 Test.Printf(_L("Testing the change of h/w config notifier\r\n"));
1069 // If support for the notifier is not supported on this platform, use a debug custom config command to force
1070 // support for the notifier.
1072 if (!PlayCapsBuf().iHwConfigNotificationSupport)
1074 r=TxSoundDevice.CustomConfig(KSndCustom_ForceHwConfigNotifSupported);
1078 /** @SYMTestCaseID PBASE-T_SOUND_API-264
1079 @SYMTestCaseDesc Change of h/w config. notifier - receiving notification.
1080 @SYMTestPriority Critical
1081 @SYMTestActions 1) Register for notification of a change in the hardware configuration of the device on
1082 either the record or playback channel. Using the CustomConfig() test mode supported by the
1083 driver, trigger the notifier - signalling that the headset is not present.
1084 2) Re-register for notification of a change in the hardware configuration on the same channel.
1085 Again using the CustomConfig() test mode, trigger the notifier - this time signalling that the
1087 @SYMTestExpectedResults 1) The outstanding request for notification should complete with KErrNone and the status of
1088 the bolean aHeadsetPresent should be false.
1089 2) The outstanding request for notification should complete with KErrNone and the status of
1090 the bolean aHeadsetPresent should be true.
1091 @SYMREQ PREQ1073.4 */
1093 // Register for notification of a change in the hardware configuration of the device.
1094 TRequestStatus stat;
1095 TBool headsetPresent=ETrue;
1096 TxSoundDevice.NotifyChangeOfHwConfig(stat,headsetPresent);
1097 CHECK(stat==KRequestPending);
1099 Test.Next(_L("Trigger the notifier"));
1100 // Use another debug custom config command to trigger the notifier.
1101 r=TxSoundDevice.CustomConfig(KSndCustom_CompleteChangeOfHwConfig,(TAny*)0x00); // Signal headset not present.
1103 User::WaitForRequest(stat);
1104 CHECK_NOERROR(stat.Int());
1105 CHECK(!headsetPresent);
1107 Test.Next(_L("Trigger the notifier again"));
1108 TxSoundDevice.NotifyChangeOfHwConfig(stat,headsetPresent);
1109 CHECK(stat==KRequestPending);
1110 r=TxSoundDevice.CustomConfig(KSndCustom_CompleteChangeOfHwConfig,(TAny*)0x01); // Signal headset is present.
1112 User::WaitForRequest(stat);
1113 CHECK_NOERROR(stat.Int());
1114 CHECK(headsetPresent);
1116 Test.Next(_L("Test cancelling the notifier"));
1117 TxSoundDevice.NotifyChangeOfHwConfig(stat,headsetPresent);
1118 CHECK(stat==KRequestPending);
1119 TxSoundDevice.CancelNotifyChangeOfHwConfig();
1120 User::WaitForRequest(stat);
1121 CHECK(stat==KErrCancel);
1123 /** @SYMTestCaseID PBASE-T_SOUND_API-265
1124 @SYMTestCaseDesc Change of h/w config. notifier - receiving notification.
1125 @SYMTestPriority Critical
1126 @SYMTestActions 1) Register for notification of a change in the hardware configuration of the device on
1127 either the record or playback channel. Using the CustomConfig() test mode supported by the
1128 driver, trigger the notifier - signalling that the headset is not present.
1129 2) Re-register for notification of a change in the hardware configuration on the same channel.
1130 Again using the CustomConfig() test mode, trigger the notifier - this time signalling that the
1132 @SYMTestExpectedResults 1) The outstanding request for notification should complete with KErrNone and the status of
1133 the bolean aHeadsetPresent should be false.
1134 2) The outstanding request for notification should complete with KErrNone and the status of
1135 the bolean aHeadsetPresent should be true.
1136 @SYMREQ PREQ1073.4 */
1138 Test.Next(_L("Test that closing the channel cancels the notifier"));
1139 TxSoundDevice.NotifyChangeOfHwConfig(stat,headsetPresent);
1140 CHECK(stat==KRequestPending);
1141 TxSoundDevice.Close();
1142 User::WaitForRequest(stat);
1143 CHECK(stat==KErrCancel);
1145 Test.Next(_L("Re-open the channel"));
1146 r = TxSoundDevice.Open(KSoundScTxUnit0);
1151 LOCAL_C void TestUnloadDrivers()
1153 /** @SYMTestCaseID PBASE-T_SOUND_API-221
1154 @SYMTestCaseDesc Un-installing the LDD
1155 @SYMTestPriority Critical
1156 @SYMTestActions Attempt to un-install the LDD (using User::FreeLogicalDevice()).
1157 @SYMTestExpectedResults KErrNone - LDD unloads successfully
1158 @SYMREQ PREQ1073.4 */
1160 TInt r=User::FreeLogicalDevice(KDevSoundScName);
1161 Test.Printf(_L("Unloading %S.LDD - %d\r\n"),&KDevSoundScName,r);
1164 /** @SYMTestCaseID PBASE-T_SOUND_API-222
1165 @SYMTestCaseDesc Un-installing the PDD
1166 @SYMTestPriority Critical
1167 @SYMTestActions Attempt to un-install the PDD (using User::FreePhysicalDevice()).
1168 @SYMTestExpectedResults KErrNone - PDD unloads successfully
1169 @SYMREQ PREQ1073.4 */
1171 TName pddName(KDevSoundScName);
1172 _LIT(KPddWildcardExtension,".*");
1173 pddName.Append(KPddWildcardExtension);
1174 TFindPhysicalDevice findPD(pddName);
1175 TFullName findResult;
1176 r=findPD.Next(findResult);
1179 r=User::FreePhysicalDevice(findResult);
1180 Test.Printf(_L("Unloading %S.PDD - %d\r\n"),&findResult,r);
1182 findPD.Find(pddName); // Reset the find handle now that we have deleted something from the container.
1183 r=findPD.Next(findResult);
1188 Invoke the helper executable, tell it what unit to open RSoundSc for.
1190 @param aUnit Parameter to supply to RSoundSc ie. KSoundScTxUnit0, KSoundScRxUnit0
1191 @param aExpectedError The expected return code from RSoundSc::Open
1193 static void RunHelper(TInt aUnit, TInt aExpectedError)
1198 r = ph.Create(KHelperExe, KNullDesC);
1200 r = ph.SetParameter(KSlot, aUnit);
1205 Test(rsh == KRequestPending);
1207 User::WaitForRequest(rsh);
1209 // process has died so check the panic category and reason match the expected values
1210 CHECK_EQUAL(ph.ExitType(), EExitPanic);
1211 Test(ph.ExitCategory()==KSoundAPICaps,__LINE__,(const TText*)__FILE__);
1212 CHECK_EQUAL(ph.ExitReason(), aExpectedError);
1218 Delete the copy of the helper exe which was created with altered capabilities
1220 static TInt DeleteHelper()
1223 TInt r = fs.Connect();
1225 TFileName fileName(KSysBin);
1226 fileName.Append(KPathDelimiter);
1227 fileName+=KHelperExe;
1228 //delete modified version of helper exe
1229 r = fs.Delete(fileName);
1235 Use setcap.exe to create a copy of the helper executable, t_sound_api_helper.exe
1236 called t_sound_api_helper_caps.exe with the supplied capabilities.
1238 @param aCaps A bitmask of capabilities to assign to helper exe.
1240 static void SetHelperCaps(TUint32 aCaps)
1243 _LIT(KCommandLineArgsFormat, "%S %08x %S\\%S");
1245 cmdLine.Format(KCommandLineArgsFormat, &KHelperExeBase, aCaps, &KSysBin, &KHelperExe);
1248 r = p.Create(_L("setcap.exe"), cmdLine);
1253 CHECK_EQUAL(rs.Int(),KRequestPending);
1255 User::WaitForRequest(rs);
1261 Test that ECapabilityMultimediaDD is required
1262 in order to open RSoundSc for playback and that
1263 ECapabilityUserEnvironment is needed, in addition,
1266 static void TestCapabilityChecks()
1268 //convert capabilities into bitmask understood by setcap.exe
1269 const TUint32 KUserEnvironment = 1<<ECapabilityUserEnvironment;
1270 const TUint32 KMultimediaDD= 1<<ECapabilityMultimediaDD;
1272 //try to delete helper just in case it has been left hanging about from a previous run which failed
1274 SetHelperCaps(NULL);
1275 RunHelper(KSoundScTxUnit0,KErrPermissionDenied);
1276 RunHelper(KSoundScRxUnit0,KErrPermissionDenied);
1278 CHECK_NOERROR(DeleteHelper());
1279 SetHelperCaps(KMultimediaDD);
1280 RunHelper(KSoundScTxUnit0,KErrNone);
1281 RunHelper(KSoundScRxUnit0,KErrPermissionDenied);
1283 CHECK_NOERROR(DeleteHelper());
1284 SetHelperCaps(KUserEnvironment);
1285 RunHelper(KSoundScTxUnit0,KErrPermissionDenied);
1286 RunHelper(KSoundScRxUnit0,KErrPermissionDenied);
1288 CHECK_NOERROR(DeleteHelper());
1289 SetHelperCaps(KUserEnvironment|KMultimediaDD);
1290 RunHelper(KSoundScTxUnit0,KErrNone);
1291 RunHelper(KSoundScRxUnit0,KErrNone);
1293 CHECK_NOERROR(DeleteHelper());
1304 Test.Start(_L("Load"));
1305 if (Load()==KErrNotFound)
1307 Test.Printf(_L("Shared chunk sound driver not supported - test skipped\r\n"));
1314 // The __KHEAP_MARK and __KHEAP_MARKEND macros unfortunately have to be commented out or they
1315 // generate false positives on the x86pc target build. This is to do with the launching of the
1316 // helper executable, which results in another component allocating memory and not freeing it,
1317 // thus causing the macros here to trigger a kern-exec 17 that is not related to the sound driver
1318 // itself. The same macros are fine on other platforms. See DEF129273 for more information
1321 Test.Next(_L("Test Capability Checking"));
1322 TestCapabilityChecks();
1324 Test.Next(_L("Open playback channel"));
1325 r = TxSoundDevice.Open(KSoundScTxUnit0);
1328 Test.Next(_L("Open record channel"));
1329 r = RxSoundDevice.Open(KSoundScRxUnit0);
1332 Test.Next(_L("Query play formats supported"));
1333 TxSoundDevice.Caps(PlayCapsBuf);
1334 TSoundFormatsSupportedV02 playCaps=PlayCapsBuf();
1335 PrintCaps(playCaps,Test);
1337 Test.Next(_L("Query record formats supported"));
1338 RxSoundDevice.Caps(RecordCapsBuf);
1339 TSoundFormatsSupportedV02 recordCaps=RecordCapsBuf();
1340 PrintCaps(recordCaps,Test);
1342 TestSetAudioFormat();
1343 TestSetBufferConfig(0); // Without guard pages.
1344 TestSetBufferConfig(KScFlagUseGuardPages); // With guard pages.
1348 TestChangeOfHwConfigNotifier();
1350 // Note that API testing of pause/resume and volume setting are covered in T_SOUND2.
1352 /** @SYMTestCaseID PBASE-T_SOUND_API-226
1353 @SYMTestCaseDesc Closing the channel
1354 @SYMTestPriority Critical
1355 @SYMTestActions 1) With a playback channel open on the device, close the channel.
1356 2) With a record channel open on the device, close the channel.
1357 @SYMTestExpectedResults 1) No errors occur closing the channel.
1358 2) No errors occur closing the channel.
1359 @SYMREQ PREQ1073.4 */
1361 Test.Next(_L("Close channels"));
1362 RxSoundDevice.Close();
1363 TxSoundDevice.Close();
1367 // Now that both the channels are closed, unload the LDD and the PDDs.
1368 TestUnloadDrivers();