mmlibs/mmfw/src/Client/Audio/mmfclientaudioinputstream.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
// All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
// Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
// Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
// Description:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
#include "mmfclientaudioinputstream.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
#include "mmfclientaudiostreamutils.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
#include <mmf/server/devsoundstandardcustominterfaces.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#include <mmf/common/mmfpaniccodes.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include "MmfFifo.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#include <mdaaudioinputstream.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
const TInt KMicroSecsInOneSec = 1000000;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
enum TMmfAudioInputPanic
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
	EAudioInputPanicNotSupported
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
	};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
_LIT(KAudioInputStreamCategory, "CMMFMdaAudioInputStream");
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
LOCAL_C void Panic(const TMmfAudioInputPanic aPanic)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
	User::Panic(KAudioInputStreamCategory, aPanic);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
 * Static NewL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
 * @return CMdaAudioInputStream*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
EXPORT_C CMdaAudioInputStream* CMdaAudioInputStream::NewL(MMdaAudioInputStreamCallback& aCallback)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
	return NewL(aCallback, EMdaPriorityNormal, EMdaPriorityPreferenceTimeAndQuality);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
 * Static NewL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
 * @return CMdaAudioInputStream*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
EXPORT_C CMdaAudioInputStream* CMdaAudioInputStream::NewL(MMdaAudioInputStreamCallback& aCallback, TInt aPriority, TInt aPref)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	CMdaAudioInputStream* self = new(ELeave) CMdaAudioInputStream();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
	self->iProperties = CMMFMdaAudioInputStream::NewL(aCallback, aPriority, aPref);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
CMdaAudioInputStream::CMdaAudioInputStream()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
CMdaAudioInputStream::~CMdaAudioInputStream()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	if(iProperties)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
		iProperties->ShutDown();	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	delete iProperties;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
EXPORT_C void CMdaAudioInputStream::SetAudioPropertiesL(TInt aSampleRate, TInt aChannels)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	iProperties->SetAudioPropertiesL(aSampleRate, aChannels);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
EXPORT_C void CMdaAudioInputStream::Open(TMdaPackage* aSettings)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
	iProperties->Open(aSettings);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
EXPORT_C void CMdaAudioInputStream::SetGain(TInt aNewGain)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
	iProperties->SetGain(aNewGain);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
EXPORT_C TInt CMdaAudioInputStream::Gain()  const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
	return iProperties->Gain();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
EXPORT_C TInt CMdaAudioInputStream::MaxGain()  const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
	return iProperties->MaxGain();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
EXPORT_C void CMdaAudioInputStream::SetBalanceL(TInt aBalance)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
	iProperties->SetBalanceL(aBalance);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
EXPORT_C TInt CMdaAudioInputStream::GetBalanceL() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
	return iProperties->GetBalanceL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
EXPORT_C void CMdaAudioInputStream::SetPriority(TInt aPriority, TInt aPref)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
	iProperties->SetPriority(aPriority, aPref);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
EXPORT_C void CMdaAudioInputStream::ReadL(TDes8& aData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
	iProperties->ReadL(aData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
EXPORT_C void CMdaAudioInputStream::Stop()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
	iProperties->Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
EXPORT_C void CMdaAudioInputStream::RequestStop()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	iProperties->RequestStop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
EXPORT_C const TTimeIntervalMicroSeconds& CMdaAudioInputStream::Position()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
	return iProperties->Position();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
EXPORT_C TInt CMdaAudioInputStream::GetBytes()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
	return iProperties->GetBytes();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
EXPORT_C void CMdaAudioInputStream::SetSingleBufferMode(TBool aSingleMode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
	iProperties->SetSingleBufferMode(aSingleMode);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
EXPORT_C void CMdaAudioInputStream::SetDataTypeL(TFourCC aAudioType)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   169
	iProperties->SetDataTypeL(aAudioType);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   170
	}	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   171
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   172
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   173
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   174
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   175
EXPORT_C TFourCC CMdaAudioInputStream::DataType() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   176
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   177
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   178
	return iProperties->DataType();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   179
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   180
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   181
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   182
EXPORT_C TInt CMdaAudioInputStream::BitRateL() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   183
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   184
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   185
	return iProperties->BitRateL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   186
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   187
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   188
EXPORT_C void CMdaAudioInputStream::SetBitRateL(TInt aBitRate)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   189
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   190
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   191
	iProperties->SetBitRateL(aBitRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   192
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   193
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   194
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   195
EXPORT_C void CMdaAudioInputStream::GetSupportedBitRatesL(RArray<TInt>& aSupportedBitRates)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   196
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   197
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   198
	iProperties->GetSupportedBitRatesL(aSupportedBitRates);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   199
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   200
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   201
EXPORT_C TAny* CMdaAudioInputStream::CustomInterface(TUid aInterfaceId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   202
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   203
	ASSERT(iProperties);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   204
	return iProperties->CustomInterface(aInterfaceId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   205
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   206
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   207
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   208
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   209
CMMFMdaAudioInputStream* CMMFMdaAudioInputStream::NewL(MMdaAudioInputStreamCallback& aCallback)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   210
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   211
	return CMMFMdaAudioInputStream::NewL(aCallback, EMdaPriorityNormal, EMdaPriorityPreferenceTimeAndQuality);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   212
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   213
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   214
CMMFMdaAudioInputStream* CMMFMdaAudioInputStream::NewL(MMdaAudioInputStreamCallback& aCallback, TInt aPriority, TInt aPref)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   215
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   216
	CMMFMdaAudioInputStream* self = new(ELeave) CMMFMdaAudioInputStream(aCallback);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   217
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   218
	self->ConstructL(aPriority, aPref);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   219
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   220
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   221
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   222
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   223
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   224
 * Construct
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   225
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   226
 * @param	"MMdaAudioInputStreamCallback&"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   227
 *			a reference to MMdaAudioInputStreamCallback
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   228
 *			a perference value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   229
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   230
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   231
CMMFMdaAudioInputStream::CMMFMdaAudioInputStream(MMdaAudioInputStreamCallback& aCallback)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   232
	: iCallback(aCallback), iStorageItem (NULL, 0), iBufferPtr(NULL, 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   233
	// Depending on zero for construction (i.e. attribute of CBase)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   234
	//   iSingleBuffer (EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   235
	//   iState(EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   236
	//   iIsOpened(EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   237
	//   iCallbackMade(EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   238
	//   iAudioDataStored(EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   239
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   240
	iDataTypeCode.Set(TFourCC(' ','P','1','6'));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   241
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   242
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   243
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   244
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   245
 *	Second phase constructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   246
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   247
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   248
void CMMFMdaAudioInputStream::ConstructL(TInt aPriority, TInt aPref)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   249
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   250
	iDevSound = CMMFDevSound::NewL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   251
	SetPriority(aPriority, aPref);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   252
	iFifo = new(ELeave) CMMFFifo<TDes8>();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   253
	iActiveCallback = new(ELeave) CActiveCallback(iCallback);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   254
	iActiveSchedulerWait = new(ELeave) CActiveSchedulerWait;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   255
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   256
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   257
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   258
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   259
 *	Destructor
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   260
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   261
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   262
CMMFMdaAudioInputStream::~CMMFMdaAudioInputStream()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   263
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   264
	delete iFifo;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   265
	delete iDevSound;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   266
	delete iActiveCallback;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   267
	delete iActiveSchedulerWait;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   268
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   269
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   270
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   271
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   272
 *  Set audio input stream properties	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   273
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   274
 *	@param	"TInt aSampleRate"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   275
 *			a specified priority value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   276
 *	@param	"TInt aChannels"		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   277
 *			a specified preference value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   278
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   279
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   280
void CMMFMdaAudioInputStream::SetAudioPropertiesL(TInt aSampleRate, TInt aChannels)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   281
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   282
	if (iIsOpenState == EIsOpen)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   283
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   284
		RealSetAudioPropertiesL(aSampleRate, aChannels);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   285
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   286
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   287
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   288
		// cache for application later
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   289
		iSettings.iSampleRate = aSampleRate;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   290
		iSettings.iChannels = aChannels;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   291
		iAudioDataStored = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   292
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   293
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   294
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   295
void CMMFMdaAudioInputStream::RealSetAudioPropertiesL(TInt aSampleRate, TInt aChannels)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   296
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   297
	TMMFCapabilities capabilities = iDevSound->Config();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   298
	capabilities.iChannels = StreamUtils::MapChannelsMdaToMMFL(aChannels);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   299
	capabilities.iRate = StreamUtils::MapSampleRateMdaToMMFL(aSampleRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   300
	iDevSound->SetConfigL(capabilities);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   301
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   302
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   303
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   304
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   305
 *  Open a audio ouptut stream	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   306
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   307
 *	@param	"TMdaPackage* Settings"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   308
 *			a pointer point to TMdaPackage
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   309
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   310
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   311
void CMMFMdaAudioInputStream::Open(TMdaPackage* aSettings)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   312
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   313
	iIsOpenState = EIsOpening;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   314
	//store aSettings
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   315
	if (aSettings && (aSettings->Type().iUid == KUidMdaDataTypeSettingsDefine))
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   316
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   317
		TMdaAudioDataSettings* tmpSettings = STATIC_CAST(TMdaAudioDataSettings*, aSettings);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   318
		iSettings = *tmpSettings;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   319
		iAudioDataStored = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   320
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   321
	TRAPD(err, iDevSound->InitializeL(*this, iDataTypeCode, EMMFStateRecording));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   322
	if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   323
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   324
		// Signal for the MaiscOpenComplete callback to be called asynchronously
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   325
		iActiveCallback->Signal(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   326
		iIsOpenState = EIsNotOpen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   327
		iAudioDataStored = EFalse; // reset - if was set we throw away due to failure
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   328
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   329
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   330
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   331
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   332
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   333
 *  To get the maximum gain level	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   334
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   335
 *	@return	"TInt"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   336
 *			the maximum gain value in integer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   337
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   338
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   339
TInt CMMFMdaAudioInputStream::MaxGain() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   340
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   341
	return iDevSound->MaxGain();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   342
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   343
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   344
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   345
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   346
 *  To get the current gain level	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   347
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   348
 *	@return	"TInt"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   349
 *			the current gain value in integer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   350
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   351
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   352
TInt CMMFMdaAudioInputStream::Gain() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   353
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   354
	return iDevSound->Gain();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   355
	} 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   356
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   357
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   358
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   359
 *  Set audio input stream gain to the specified value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   360
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   361
 *	@param	"TInt aGain"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   362
 *			a specified gain value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   363
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   364
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   365
void CMMFMdaAudioInputStream::SetGain(TInt aGain)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   366
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   367
	iDevSound->SetGain(aGain);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   368
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   369
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   370
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   371
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   372
 *  Set audio input stream balance	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   373
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   374
 *	@param	"TInt aBalance"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   375
 *			a specified balance value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   376
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   377
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   378
void CMMFMdaAudioInputStream::SetBalanceL(TInt aBalance)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   379
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   380
	// test and clip balance to min / max range [-100 <-> 100]
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   381
	// clip rather than leave as this isn't a leaving function
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   382
	if (aBalance < KMMFBalanceMaxLeft) aBalance = KMMFBalanceMaxLeft;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   383
	if (aBalance > KMMFBalanceMaxRight) aBalance = KMMFBalanceMaxRight;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   384
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   385
	// separate out left and right balance
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   386
	TInt left  = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   387
	TInt right = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   388
	StreamUtils::CalculateLeftRightBalance( left, right, aBalance );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   389
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   390
	// send the balance to SoundDevice
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   391
	iDevSound->SetRecordBalanceL(left, right);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   392
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   393
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   394
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   395
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   396
 *  To get the current balance value.This function may not return the same value 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   397
 *	as passed to SetBalanceL depending on the internal implementation in 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   398
 *	the underlying components.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   399
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   400
 *	@return	"TInt"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   401
 *			the current balance value in integer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   402
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   403
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   404
TInt CMMFMdaAudioInputStream::GetBalanceL() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   405
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   406
	TInt rightBalance = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   407
	TInt leftBalance  = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   408
	iDevSound->GetRecordBalanceL(leftBalance, rightBalance);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   409
	TInt balance  = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   410
	StreamUtils::CalculateBalance( balance, leftBalance, rightBalance );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   411
	return balance;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   412
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   413
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   414
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   415
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   416
 *  Set audio input stream priority	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   417
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   418
 *	@param	"TInt aPriority"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   419
 *			a specified priority value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   420
 *	@param	"TInt aPref"		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   421
 *			a specified preference value
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   422
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   423
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   424
void CMMFMdaAudioInputStream::SetPriority(TInt aPriority, TInt aPref)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   425
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   426
	TMMFPrioritySettings settings;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   427
	settings.iPriority = aPriority;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   428
	settings.iPref = aPref;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   429
	iDevSound->SetPrioritySettings(settings);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   430
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   431
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   432
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   433
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   434
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   435
 *  To read data from input stream 	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   436
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   437
 *	@param	"TDesC8& aData"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   438
 *			a stream data 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   439
 * 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   440
 *  @capability	UserEnvironment
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   441
 *			For recording - the requesting client process must have the 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   442
 *			UserEnvironment capability.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   443
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   444
void CMMFMdaAudioInputStream::ReadL(TDes8& aData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   445
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   446
	User::LeaveIfError(Read(aData));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   447
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   448
	if (iState == EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   449
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   450
		iDevSound->RecordInitL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   451
		iState = ERecording;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   452
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   453
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   454
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   455
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   456
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   457
 *  To read data from input stream 	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   458
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   459
 *	@param	"TDesC8& aData"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   460
 *			a stream data 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   461
 * 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   462
 *  @capability	UserEnvironment
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   463
 *			For recording - the requesting client process must have the 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   464
 *			UserEnvironment capability.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   465
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   466
TInt CMMFMdaAudioInputStream::Read(TDes8& aData)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   467
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   468
	TMMFFifoItem<TDes8>* item = new TMMFFifoItem<TDes8>(aData);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   469
	if (!item)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   470
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   471
		return KErrNoMemory;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   472
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   473
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   474
	iFifo->AddToFifo(*item);	// no issue with memory alloc
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   475
								// each element contains storage space for link to the next
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   476
	return KErrNone;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   477
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   478
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   479
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   480
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   481
 *  To stop write data to stream 	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   482
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   483
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   484
void CMMFMdaAudioInputStream::Stop()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   485
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   486
	// Need to take for the case where Stop is invoked directly after a call to RequestStop.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   487
	// We have chosen to allow the Stop to go through as this could be more important.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   488
	// This is non-reentrant code but will suffice for our needs.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   489
	if (iState != EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   490
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   491
		// Amend the state so RequestStop or Stop initiated by it (indirectly) won't function
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   492
		iState = EStopped;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   493
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   494
		if (iSingleBuffer && iStorageItem.Ptr() != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   495
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   496
			iCallback.MaiscBufferCopied(KErrAbort, iStorageItem);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   497
			iStorageItem.Set (NULL,0,0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   498
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   499
	 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   500
		// Delete all buffers in the fifo and notify the observer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   501
		TMMFFifoItem<TDes8>* firstItem;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   502
		while((firstItem = iFifo->Get()) != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   503
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   504
			iFifo->RemoveFirstItem();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   505
			if (!iSingleBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   506
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   507
				iCallback.MaiscBufferCopied(KErrAbort,firstItem->GetData());		 		 		 		 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   508
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   509
			delete firstItem;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   510
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   511
	 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   512
		iDevSound->Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   513
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   514
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   515
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   516
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   517
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   518
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   519
 *  To pause write data to stream 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   520
 *  Allow yet unprocessed buffers to be processed and passed back via BufferToBeEmptied.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   521
 *  When the last (empty) buffer arrives, Stop is called.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   522
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   523
void CMMFMdaAudioInputStream::RequestStop()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   524
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   525
	// [ precondition that we are not already stopped 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   526
	// && if we are stopped do nothing.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   527
	// If we are stopping a recording, we need to give the server a chance to 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   528
	// process that data which has already been captured. We therefore stay in the EPause
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   529
	// state.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   530
	if (iState != EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   531
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   532
		if (iState != EStopping)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   533
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   534
			// We can only be Recording, if we have other states later they can be tested here.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   535
			iDevSound->Pause();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   536
			iState = EStopping;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   537
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   538
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   539
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   540
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   541
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   542
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   543
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   544
 *  To get the current position in the data stream	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   545
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   546
 *	@return	"TTimeIntervalMicroSeconds&"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   547
 *			the current position in integer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   548
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   549
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   550
const TTimeIntervalMicroSeconds& CMMFMdaAudioInputStream::Position()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   551
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   552
	TInt64 position = iDevSound->SamplesRecorded();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   553
	position = position * KMicroSecsInOneSec / StreamUtils::SampleRateAsValue(iDevSound->Config());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   554
	iPosition = (iState == ERecording) ? position : 0; // Shouldn't need to check for playing but CMMFDevSound doesn't reset bytes played after a stop
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   555
	return iPosition;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   556
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   557
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   558
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   559
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   560
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   561
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   562
 *  To return the current number of bytes recorded by audio hardware
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   563
 *	@return "the current current number of bytes rendered by audio hardware in integer"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   564
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   565
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   566
TInt CMMFMdaAudioInputStream::GetBytes()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   567
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   568
	return iBytesRecorded;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   569
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   570
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   571
void CMMFMdaAudioInputStream::SetDataTypeL(TFourCC aAudioType)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   572
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   573
	if(iState != EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   574
		User::Leave(KErrServerBusy);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   575
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   576
	if(aAudioType == iDataTypeCode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   577
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   578
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   579
	TMMFPrioritySettings prioritySettings ; 	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   580
	prioritySettings.iState = EMMFStateRecording;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   581
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   582
	RArray<TFourCC> supportedDataTypes;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   583
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   584
	CleanupClosePushL(supportedDataTypes);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   585
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   586
	TRAPD(err, iDevSound->GetSupportedOutputDataTypesL(supportedDataTypes, prioritySettings));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   587
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   588
	if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   589
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   590
		if (supportedDataTypes.Find(aAudioType) == KErrNotFound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   591
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   592
			User::Leave(KErrNotSupported);	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   593
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   594
		//if match, set the 4CC of AudioType to match
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   595
		iDataTypeCode.Set(aAudioType);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   596
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   597
	else //we had a real leave error from GetSupportedInputDataTypesL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   598
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   599
		User::Leave(err);	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   600
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   601
	CleanupStack::PopAndDestroy(&supportedDataTypes);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   602
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   603
	if(iIsOpenState!=EIsNotOpen)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   604
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   605
		// need to recall or restart InitializeL() process
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   606
		iDevSound->CancelInitialize(); // call just in case mid-InitializeL. No harm if not. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   607
									   // if not supported then assume old DevSound behaviour anyway
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   608
									   // where InitializeL() implicitly cancels, so no harm either way
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   609
		iIsOpenState = EIsOpening;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   610
		iInitCallFrmSetDataType = ETrue;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   611
		TRAPD(err, iDevSound->InitializeL(*this, iDataTypeCode, EMMFStateRecording));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   612
		if (err != KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   613
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   614
			// Leave if error.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   615
			iIsOpenState = EIsNotOpen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   616
			iInitCallFrmSetDataType = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   617
			User::Leave(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   618
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   619
		// In some implementations InitializeComplete is sent 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   620
		// in context, so check before starting activeSchedulerWait.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   621
		else if(iIsOpenState == EIsOpening)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   622
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   623
			iInitializeState = KRequestPending;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   624
			iActiveSchedulerWait->Start();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   625
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   626
		iInitCallFrmSetDataType = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   627
		User::LeaveIfError(iInitializeState);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   628
		}	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   629
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   630
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   631
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   632
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   633
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   634
TFourCC CMMFMdaAudioInputStream::DataType() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   635
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   636
	return iDataTypeCode;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   637
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   638
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   639
TInt CMMFMdaAudioInputStream::BitRateL() const
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   640
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   641
	TAny* ptr = iDevSound->CustomInterface(KUidCustomInterfaceDevSoundBitRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   642
	if (ptr == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   643
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   644
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   645
	MMMFDevSoundCustomInterfaceBitRate* bitrate = static_cast<MMMFDevSoundCustomInterfaceBitRate*>(ptr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   646
	return bitrate->BitRateL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   647
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   648
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   649
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   650
void CMMFMdaAudioInputStream::SetBitRateL(TInt aBitRate)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   651
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   652
	TAny* ptr = iDevSound->CustomInterface(KUidCustomInterfaceDevSoundBitRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   653
	if (ptr == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   654
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   655
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   656
	MMMFDevSoundCustomInterfaceBitRate* bitrate = static_cast<MMMFDevSoundCustomInterfaceBitRate*>(ptr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   657
	bitrate->SetBitRateL(aBitRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   658
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   659
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   660
void CMMFMdaAudioInputStream::GetSupportedBitRatesL(RArray<TInt>& aSupportedBitRates)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   661
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   662
	// ensure that the array is empty before passing it in
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   663
	aSupportedBitRates.Reset();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   664
	TAny* ptr = iDevSound->CustomInterface(KUidCustomInterfaceDevSoundBitRate);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   665
	if (ptr == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   666
		User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   667
	MMMFDevSoundCustomInterfaceBitRate* bitrate = static_cast<MMMFDevSoundCustomInterfaceBitRate*>(ptr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   668
	bitrate->GetSupportedBitRatesL(aSupportedBitRates);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   669
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   670
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   671
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   672
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   673
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   674
CMMFMdaAudioInputStream::CActiveCallback::CActiveCallback(MMdaAudioInputStreamCallback& aCallback)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   675
	: CActive(EPriorityStandard), iCallback(aCallback)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   676
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   677
	CActiveScheduler::Add(this);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   678
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   679
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   680
CMMFMdaAudioInputStream::CActiveCallback::~CActiveCallback()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   681
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   682
	Cancel();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   683
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   684
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   685
void CMMFMdaAudioInputStream::CActiveCallback::RunL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   686
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   687
	iCallback.MaiscOpenComplete(iStatus.Int());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   688
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   689
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   690
void CMMFMdaAudioInputStream::CActiveCallback::DoCancel()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   691
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   692
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   693
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   694
void CMMFMdaAudioInputStream::CActiveCallback::Signal(const TInt aReason)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   695
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   696
	ASSERT(!IsActive());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   697
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   698
	// Signal ourselves to run with the given completion code
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   699
	TRequestStatus* status = &iStatus;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   700
	User::RequestComplete(status, aReason);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   701
	SetActive();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   702
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   703
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   704
//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   705
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   706
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   707
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   708
 *  To be called when intialize stream complete	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   709
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   710
 *	@param	"TInt aError"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   711
 *			error code, initialize stream succeed when aError = 0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   712
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   713
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   714
void CMMFMdaAudioInputStream::InitializeComplete(TInt aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   715
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   716
	TInt err = aError;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   717
	if(iIsOpenState == EIsOpening)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   718
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   719
		if (err == KErrNone)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   720
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   721
			// Use settings to set audio properties after the dev sound has been
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   722
			// successfully initialised
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   723
			if(iAudioDataStored)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   724
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   725
				TRAP(err, RealSetAudioPropertiesL(iSettings.iSampleRate, iSettings.iChannels));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   726
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   727
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   728
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   729
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   730
		// Signal for the MaiscOpenComplete callback to be called asynchronously.Ignore if InitializeL is called from SetDataTypeL
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   731
		if(!iInitCallFrmSetDataType)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   732
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   733
			iActiveCallback->Signal(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   734
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   735
		iIsOpenState = err ? EIsNotOpen : EIsOpen;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   736
		//reset iAudioDataStored flag if set - whatever don't want to use next time
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   737
		iAudioDataStored = EFalse;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   738
		if(iInitializeState == KRequestPending)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   739
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   740
			iInitializeState = err;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   741
			iActiveSchedulerWait->AsyncStop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   742
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   743
		else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   744
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   745
			iInitializeState = err;//Set the error.		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   746
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   747
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   748
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   749
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   750
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   751
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   752
 *  Do not support
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   753
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   754
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   755
void CMMFMdaAudioInputStream::ToneFinished(TInt /*aError*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   756
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   757
	Panic(EAudioInputPanicNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   758
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   759
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   760
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   761
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   762
 *  Called when sound device has filled data buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   763
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   764
 *	@param	"CMMFBuffer* aBuffer"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   765
 *			a pointer point to CMMFBuffer, which is used for recieved data
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   766
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   767
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   768
void CMMFMdaAudioInputStream::BufferToBeEmptied(CMMFBuffer* aBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   769
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   770
	// Simply put, tries to copy the data from aBuffer into the clients storage buffers. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   771
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   772
	// The input stream iFifo data member is used to store the clients storage buffers
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   773
	// that are passed to it via a call to ReadL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   774
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   775
	// If iSingleBuffer is False, the first buffer on the fifo is copied to. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   776
	// This buffer is then removed off the fifo.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   777
	// The callback MaiscBufferCopied is invoked after each copy, passing that buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   778
	// If the data is greater than the buffer then this process repeats with the next buffer.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   779
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   780
	// If iSingleBuffer is True, it is assumed only one buffer is on the fifo.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   781
	// The behaviour is the same as above except that a descriptor representing the 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   782
	// buffers empty part is placed at the end of the fifo, and the callback 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   783
	// MaiscBufferCopied is invoked only when the buffer is full.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   784
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   785
	// If the client sets iSingleBuffer to True and places more than one buffer on the fifo
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   786
	// the behaviour is undefined and unsupported.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   787
	//
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   788
	// If there are no more storage buffers on the fifo, the callback 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   789
	// MaiscRecordComplete(KErrOverflow) is invoked.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   790
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   791
	const TDesC8& buffer = STATIC_CAST(CMMFDataBuffer*, aBuffer)->Data();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   792
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   793
	TInt lengthCopied = 0;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   794
	iBytesRecorded += buffer.Length();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   795
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   796
	// A stop was requested after all the data has been received
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   797
	if (iState == EStopping && buffer.Length() == 0)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   798
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   799
	 	Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   800
		iCallback.MaiscRecordComplete(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   801
		return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   802
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   803
	else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   804
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   805
		// The fifo may have multiple storage buffers, i.e. one in each of its entries.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   806
		// Fill what we can in each. If we get an empty buffer then we have finished recording.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   807
		while (lengthCopied < buffer.Length())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   808
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   809
			// Chop up aBuffer into slices the buffers in iFifo can handle
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   810
			TMMFFifoItem<TDes8>* firstItem = iFifo->Get();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   811
			
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   812
			if(firstItem != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   813
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   814
				TDes8& writeBuf = firstItem->GetData();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   815
						
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   816
				// We have a spare buffer slot
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   817
				TInt slotLength = Min(buffer.Length()-lengthCopied, writeBuf.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   818
				writeBuf = buffer.Mid(lengthCopied, slotLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   819
				lengthCopied += slotLength;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   820
				
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   821
				// Determine whether to callback the client or not.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   822
				// I.e. if we have multiple small buffers that we want to process quickly or
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   823
				// when a singular buffer is FULL.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   824
				// Note: That if the client asks to Stop, the buffer may not be filled!
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   825
				if (iSingleBuffer)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   826
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   827
					// Remember this item for later. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   828
					// We really only want the first item as this covers the entire
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   829
					// client storage buffer. We will adjust the actual length later.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   830
					if (iStorageItem.Ptr() == NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   831
						{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   832
						iStorageItem.Set (const_cast<TUint8*>(writeBuf.Ptr()), 0, writeBuf.MaxLength());
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   833
						}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   834
					
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   835
					// In this iteration we may just be looking at a right-part of the original
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   836
					// buffer. Update the actual length of data.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   837
					TInt actualLength = (writeBuf.Ptr()-iStorageItem.Ptr()) + writeBuf.Length();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   838
					iStorageItem.SetLength(actualLength);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   839
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   840
					// Is the buffer full?
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   841
					if (writeBuf.Length() == writeBuf.MaxLength())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   842
						{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   843
						// The singular buffer has been filled so pass it back to the client
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   844
						iCallback.MaiscBufferCopied(KErrNone, iStorageItem);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   845
						iStorageItem.Set (NULL,0,0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   846
						}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   847
					else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   848
						{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   849
						// Create a window to the 'remaining' free section of the storage buffer
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   850
						iBufferPtr.Set (const_cast<TUint8*>(writeBuf.Ptr())+lengthCopied, 0, writeBuf.MaxLength()-lengthCopied);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   851
						
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   852
						// Add the window to the fifo
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   853
						TInt err = Read(iBufferPtr);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   854
						if (err)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   855
							{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   856
							Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   857
							iCallback.MaiscRecordComplete(err);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   858
							return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   859
							}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   860
						ASSERT(iState == ERecording);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   861
						}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   862
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   863
				else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   864
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   865
					// Notify client
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   866
					iCallback.MaiscBufferCopied(KErrNone, writeBuf);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   867
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   868
				//Check if client called Stop from the MaiscBufferCopied. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   869
				//If so, we should neither continue this loop nor delete the first item. Stop cleans up all the buffers
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   870
				if(iState == EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   871
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   872
					break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   873
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   874
				else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   875
					{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   876
					// Remove this storage buffer from the fifo as we want to have access to any others behind it.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   877
					iFifo->RemoveFirstItem();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   878
					delete firstItem;						
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   879
					}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   880
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   881
			else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   882
				{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   883
				// run out of buffers - report an overflow error
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   884
				Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   885
				iCallback.MaiscRecordComplete(KErrOverflow);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   886
				return;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   887
				}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   888
			}// while
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   889
		} // else
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   890
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   891
	// Keep recording if there are free buffers
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   892
	if (!iFifo->IsEmpty())
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   893
		iDevSound->RecordData();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   894
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   895
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   896
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   897
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   898
 *  Called when record operation complete, successfully or otherwise	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   899
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   900
 *	@param	"TInt aError"	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   901
 *			an error value which will indicate playing successfully complete
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   902
 *			if error value is 0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   903
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   904
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   905
void CMMFMdaAudioInputStream::PlayError(TInt /*aError*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   906
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   907
	Panic(EAudioInputPanicNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   908
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   909
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   910
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   911
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   912
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   913
 *  Do not support
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   914
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   915
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   916
void CMMFMdaAudioInputStream::BufferToBeFilled(CMMFBuffer* /*aBuffer*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   917
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   918
	Panic(EAudioInputPanicNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   919
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   920
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   921
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   922
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   923
 *  Do not support
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   924
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   925
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   926
void CMMFMdaAudioInputStream::RecordError(TInt aError)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   927
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   928
	if (iState == ERecording)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   929
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   930
		if (aError != KErrCancel)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   931
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   932
			iCallback.MaiscRecordComplete(aError);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   933
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   934
		// else must have been cancelled by client. Doesn't need to be notified
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   935
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   936
		iState = EStopped;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   937
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   938
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   939
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   940
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   941
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   942
 *  Do not support
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   943
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   944
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   945
void CMMFMdaAudioInputStream::ConvertError(TInt /*aError*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   946
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   947
	Panic(EAudioInputPanicNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   948
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   949
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   950
/**
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   951
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   952
 *  Do not support
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   953
 *
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   954
 */
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   955
void CMMFMdaAudioInputStream::DeviceMessage(TUid /*aMessageType*/, const TDesC8& /*aMsg*/)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   956
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   957
	Panic(EAudioInputPanicNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   958
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   959
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   960
// CustomInferface - just pass on to DevSound. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   961
TAny* CMMFMdaAudioInputStream::CustomInterface(TUid aInterfaceId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   962
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   963
	return iDevSound->CustomInterface(aInterfaceId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   964
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   965
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   966
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   967
void CMMFMdaAudioInputStream::SetSingleBufferMode(TBool aSingleMode)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   968
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   969
	iSingleBuffer = aSingleMode;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   970
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   971
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   972
void CMMFMdaAudioInputStream::ShutDown()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   973
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   974
	// Need to take for the case where Stop is invoked from the destructor of CMdaAudioInputStream 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   975
	// Need to ensure that there are no callbacks to the client at this stage
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   976
	if (iState != EStopped)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   977
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   978
		iState = EStopped;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   979
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   980
		if (iSingleBuffer && iStorageItem.Ptr() != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   981
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   982
			iStorageItem.Set (NULL,0,0);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   983
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   984
	 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   985
		// Delete all buffers in the fifo
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   986
		TMMFFifoItem<TDes8>* firstItem;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   987
		while((firstItem = iFifo->Get()) != NULL)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   988
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   989
			iFifo->RemoveFirstItem();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   990
			delete firstItem;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   991
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   992
	 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   993
		iDevSound->Stop();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   994
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   995
	}