symbian-qemu-0.9.1-12/libsdl-trunk/src/audio/symbian/streamplayer.cpp
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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