Home | History | Annotate | Download | only in symbian
      1 #include "streamplayer.h"
      2 #include<mda/common/audio.h>
      3 
      4 
      5 
      6 const TInt KMaxVolume(256);
      7 
      8 LOCAL_C TInt GetSampleRate(TInt aRate)
      9     {
     10     switch(aRate)
     11         {
     12         case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
     13         case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
     14         case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
     15         case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
     16         case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
     17         case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
     18         case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
     19         case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
     20         case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
     21         case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
     22         case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
     23         }
     24     return KErrNotFound;
     25     }
     26 
     27 LOCAL_C TInt GetChannels(TInt aChannels)
     28     {
     29     switch(aChannels)
     30         {
     31         case 1: return TMdaAudioDataSettings::EChannelsMono;
     32         case 2: return TMdaAudioDataSettings::EChannelsStereo;
     33         }
     34     return KErrNotFound;
     35     }
     36 
     37 TInt CStreamPlayer::ClosestSupportedRate(TInt aRate)
     38 	{
     39 	if(aRate > 96000)
     40 		return 96000;
     41 	TInt rate = aRate;
     42 	while(GetSampleRate(rate) == KErrNotFound)
     43 		{
     44 		++rate;
     45 		}
     46 	return rate;
     47 	}
     48 
     49 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider,  MStreamObs& aObs) :
     50  iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
     51 	{
     52 	}
     53 
     54 CStreamPlayer::~CStreamPlayer()
     55 	{
     56 	iState |= EDied;
     57 	if(iState & EInited)
     58 		Close();
     59 	User::After(100000); //wait buffer to be flushed
     60 	ASSERT(iPtr.Length() == 0);
     61 	delete iStream;
     62 	}
     63 
     64 
     65 void CStreamPlayer::ConstructL()
     66 	{
     67 	iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
     68 	iSilence.SetMax();
     69 	iSilence.FillZ();
     70 	}
     71 
     72 
     73 TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType)
     74 	{
     75 	Close();
     76 
     77 	iType = aType;
     78 
     79 	iRate = GetSampleRate(aRate);
     80 	if(iRate == KErrNotFound)
     81 		return KErrNotSupported;
     82 
     83 	iChannels = GetChannels(aChannels);
     84 	if(iChannels == KErrNotFound)
     85 		return KErrNotSupported;
     86 
     87 	Open();
     88 
     89     return KErrNone;
     90 	}
     91 
     92 
     93 TInt CStreamPlayer::MaxVolume() const
     94 	{
     95 	return KMaxVolume;
     96 	}
     97 
     98 void CStreamPlayer::SetVolume(TInt aNew)
     99     {
    100 
    101     const TInt maxi = MaxVolume();
    102     if(aNew > maxi)
    103 		return;
    104     if(aNew < 0)
    105     	return;
    106 
    107     iVolume = aNew;
    108 
    109     iState |= EVolumeChange;
    110     }
    111 
    112  TInt CStreamPlayer::Volume() const
    113     {
    114 	return iVolume;
    115     }
    116 
    117 void CStreamPlayer::Open()
    118 	{
    119 	TMdaAudioDataSettings audioSettings;
    120 	audioSettings.Query();
    121     audioSettings.iCaps = TMdaAudioDataSettings::ERealTime |
    122      	TMdaAudioDataSettings::ESampleRateFixed;
    123     audioSettings.iSampleRate = iRate;
    124     audioSettings.iChannels = iChannels;
    125 	audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting;
    126 	audioSettings.iVolume = 0;
    127 
    128 	iState &= ~EStopped;
    129     iStream->Open(&audioSettings);
    130 	}
    131 
    132 void CStreamPlayer::Stop()
    133 	{
    134 	if(iState & (EStarted | EInited))
    135 		{
    136 		Close();
    137 		iState |= EStopped;
    138 		}
    139 	}
    140 
    141 void CStreamPlayer::Start()
    142 	{
    143 	if(iPtr.Length() == 0)
    144 		{
    145 		iState |= EStarted;
    146 		if(iState & EInited)
    147 			{
    148 			Request();
    149 			}
    150 		else if(iState & EStopped)
    151 			{
    152 			Open();
    153 			}
    154 		}
    155 	}
    156 
    157 void CStreamPlayer::Close()
    158 	{
    159 	iState &= ~EInited;
    160 	iStream->Stop();
    161 	iState &= ~EStarted;
    162 	}
    163 
    164 void CStreamPlayer::Request()
    165 	{
    166 	if(iState & EInited)
    167 		{
    168 		iPtr.Set(KNullDesC8);
    169 
    170 		if(iState & EVolumeChange)
    171 			{
    172        		const TReal newVol = iVolume;
    173        		const TReal newMax = MaxVolume();
    174        		const TInt maxVol = iStream->MaxVolume();
    175        		const TReal max = static_cast<TReal>(maxVol);
    176        		const TReal newvolume = (newVol * max) / newMax;
    177        		const TInt vol = static_cast<TReal>(newvolume);
    178        		iStream->SetVolume(vol);
    179 			iState &= ~EVolumeChange;
    180 			}
    181 
    182 		if(iState & EStarted)
    183 			{
    184 	 		iPtr.Set(iProvider.Data());
    185 			}
    186 		if(iPtr.Length() == 0)
    187 			{
    188 			iPtr.Set(iSilence);
    189 			}
    190 		TRAPD(err, iStream->WriteL(iPtr));
    191 		if(err != KErrNone)
    192 			{
    193 			iObs.Complete(MStreamObs::EWrite, err);
    194 			}
    195 	/*	else
    196 			{
    197 			iProvider.Written(iPtr.Length());
    198 			}*/
    199 		}
    200 	}
    201 
    202 
    203 void CStreamPlayer::SetCapsL()
    204 	{
    205 	iStream->SetDataTypeL(iType);
    206 	iStream->SetAudioPropertiesL(iRate, iChannels);
    207 	}
    208 
    209 void CStreamPlayer::MaoscOpenComplete(TInt aError)
    210 	{
    211 	if(aError == KErrNone)
    212 		{
    213 		TRAPD(err, SetCapsL());
    214     	if(err == KErrNone)
    215     		{
    216     		iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
    217     		iState |= EInited;
    218 
    219 
    220         	SetVolume(Volume());
    221 
    222     		if(iState & EStarted)
    223     			{
    224     			Request();
    225     			}
    226 
    227 			}
    228 		aError = err;
    229 		}
    230 	if(!(iState & EDied))
    231 		iObs.Complete(MStreamObs::EInit, aError);
    232 	}
    233 
    234 void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
    235 	{
    236 	iPtr.Set(KNullDesC8);
    237 	if(aError == KErrNone)
    238 		{
    239 		if(iState & EInited)
    240 			Request();
    241 		else
    242 			iStream->Stop();
    243 		}
    244 	else if(!(iState & EDied))
    245 		iObs.Complete(MStreamObs::EPlay, aError);
    246 	}
    247 
    248 void CStreamPlayer::MaoscPlayComplete(TInt aError)
    249 	{
    250 	iPtr.Set(KNullDesC8);
    251 	iState &= ~EStarted;
    252 	if(!(iState & EDied))
    253 		iObs.Complete(MStreamObs::EClose, aError);
    254 	}
    255 
    256 TBool CStreamPlayer::Playing() const
    257 	{
    258 	return (iState & EInited) && (iState & EStarted);
    259 	}
    260 
    261 TBool CStreamPlayer::Closed() const
    262 	{
    263 	return !(iState & EInited) && !(iState & EDied);
    264 	}
    265 
    266 	/*
    267 void CStreamPlayer::Request()
    268 	{
    269 	SetActive();
    270 	TRequestStatus* s = &iStatus;
    271 	User::RequestComplete(s, KErrNone);
    272 	}
    273 	//		iTimer.After(0);
    274 	*/
    275 
    276 
    277 
    278 
    279 
    280