×

Discussion Board

Results 1 to 10 of 10
  1. #1
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    How play Stream audio file from internet?

    Hi

    I am able to play video file from Internet, but audio file do not play from rtsp server.

    i have audio streaming example code which is play local audio file(sample.aud).

    suppose i want to play (it is a sample link) than what i do?
    rtsp://rmlivev8.bbc.net.uk/farm/*/ev7/live24/worldservice/livenews_v8.ra
    rtsp://rmlive.bbc.co.uk/bbc-rbs/rmlive/ev7/live24/radio1/live/r1_dsat_g2.ra

    if anybody knows that please help me and give me snippets or example code for that.

    SymbianTH

  2. #2
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    AudioStreamEngine.cpp
    Code:
    CMdaAudioInputStream::ReadL() 
    
    _LIT(KAudioFilePCM, "sample.aud");
    _LIT(KAudioFileAMR, "sample.amr");
    
    CAudioStreamEngine* CAudioStreamEngine::NewL(CAudioStreamAppUi* aAppUi)
        {
        ...
        }
    CAudioStreamEngine* CAudioStreamEngine::NewLC(CAudioStreamAppUi* aAppUi)
        {
       ...
        }
    void CAudioStreamEngine::ConstructL()
        {
        iInputStream = CMdaAudioInputStream::NewL(*this);
        iOutputStream = CMdaAudioOutputStream::NewL(*this);     
        iFs = CEikonEnv::Static()->FsSession();
    
        iDefaultEncoding = iInputStream->DataType();
        iCurrentEncoding = iDefaultEncoding;
    
        iStreamBuffer = HBufC8::NewMaxL(iFrameSize * iFrameCount);
        iStreamStart=0;
        iStreamEnd=iFrameCount - 1;   
        User::LeaveIfError( iFs.CreatePrivatePath( EDriveC ) );
        User::LeaveIfError( iFs.SetSessionToPrivate( EDriveC ) );
        iStop = CIdle::NewL( CActive::EPriorityIdle );
        
        iPlayUtility = CMdaAudioPlayerUtility::NewL(*this);
        iPlayUtility->OpenUrlL(_L("rtsp://rmlivev8.bbc.net.uk/farm/*/ev7/live24/worldservice/livenews_v8.ra"));
        iPlayUtility->Play();
        }
    CAudioStreamEngine::CAudioStreamEngine(CAudioStreamAppUi* aAppUi)
    : iAppUi(aAppUi), iUseAMR(EFalse), iAudioFile(KAudioFilePCM), iFrameSize(KFrameSizePCM), 
    iFrameCount(KFrameCountPCM), iStreamBuffer(0), iFramePtr(0,0), iBufferOK(EFalse)
        {
        iStreamSettings.iChannels=TMdaAudioDataSettings::EChannelsMono;
        iStreamSettings.iSampleRate=TMdaAudioDataSettings::ESampleRate8000Hz;   
        }
    CAudioStreamEngine::~CAudioStreamEngine()
        { 
        if (iInputStream)
            {
            if (iInputStatus!=ENotReady) 
                {iInputStream->Stop();}
            delete iInputStream;
            }
        if (iOutputStream)
            {
            if (iOutputStatus!=ENotReady) 
                {iOutputStream->Stop();}
            delete iOutputStream;
            }
        if (iStreamBuffer)
            {delete iStreamBuffer;}
        if (iStop)
            {iStop->Cancel();}
        delete iStop;
        }
    void CAudioStreamEngine::Play()
        {
        if (iInputStatus!=ENotReady || iOutputStatus!=ENotReady) 
            {return;}
        if(!iBufferOK)
            {return;}
        iOutputStream->Open(&iStreamSettings);
        }
    void CAudioStreamEngine::Stop()
        {
        iPlayUtility->Stop();
        if (iInputStatus!=ENotReady) 
            {
            iInputStream->Stop();
            iBufferOK = ETrue;
            iInputStatus = ENotReady;
            }       
        if (iOutputStatus!=ENotReady) 
            {
            iOutputStream->Stop();
            iOutputStatus = ENotReady;
            }
        }
    void CAudioStreamEngine::LoadAudioFileL()
        {
        RFileReadStream audiofile;
        TFileName fileName;
        fileName.Copy(iAudioFilePath);
        fileName.Append(iAudioFile);
        TInt err = audiofile.Open(iFs, fileName, EFileRead|EFileStream);
        iStreamBuffer->Des().FillZ(iFrameCount * iFrameSize);  // Empty the stream buffer
        if (err==KErrNone) 
            {
            if (iUseAMR)
                {
                TBuf8<KAMRHeaderLength> temp;
                audiofile.ReadL(temp, KAMRHeaderLength);
                }
            TUint idx=0;
            while (idx < iFrameCount)
                {
                TRAPD(fstatus, audiofile.ReadL(GetFrame(idx), iFrameSize));
                if (fstatus!=KErrNone)
                    break;
                idx++;
                }
            iStreamStart=0;
            iStreamEnd=idx-1;
            iBufferOK = ETrue;  
            }   
        else 
            {
            iBufferOK = EFalse;
            }
        audiofile.Close();
        }
    void CAudioStreamEngine::SaveAudioFileL()
        {
        if (!iBufferOK)
        {
            return;
        }
        RFileWriteStream audiofile;
    
        TVolumeInfo volinfo;
        TInt err=iFs.Volume(volinfo,EDriveC);
        if ( volinfo.iFree<(iFrameCount*iFrameSize))
            {return;}
    
        TFileName fileName;
        fileName.Copy(iAudioFilePath);
        fileName.Append(iAudioFile);
        err = audiofile.Replace(iFs, fileName, EFileWrite|EFileStream);
        if (err==KErrNone) 
            {
            if (iUseAMR)
                {
                for (int i = 0; i < KAMRHeaderLength; i++)
                   audiofile.WriteUint8L(KAMRNBHeader[i]);
                }
            for (TUint idx=iStreamStart; idx<=iStreamEnd; idx++)//iFrameCount; idx++)
                {
                audiofile.WriteL(GetFrame(idx));
                }
            }   
        audiofile.Close();
        }
    void CAudioStreamEngine::SetEncodingL(TBool aAmr)
        {
        if (iUseAMR != aAmr)
            {
            iUseAMR = aAmr;
            if (iUseAMR)
                {
                TRAPD(err, iInputStream->SetDataTypeL(KMMFFourCCCodeAMR));
                if (err != KErrNone)
                    {
                    iCurrentEncoding = iDefaultEncoding;
                    iUseAMR = EFalse;
                    return;  
                    }
                else
                    {
                    iCurrentEncoding = KMMFFourCCCodeAMR;
                    iAudioFile.Zero();  
                    iAudioFile.Append(KAudioFileAMR);
                    iFrameCount = KFrameCountAMR;
                    iFrameSize = KFrameSizeAMR;
                    }
                }
            else
                {
                iCurrentEncoding = iDefaultEncoding;
                iAudioFile.Zero();               
                iAudioFile.Append(KAudioFilePCM);
                iFrameCount = KFrameCountPCM;
                iFrameSize = KFrameSizePCM;
                }
            iBufferOK = EFalse; 
            if (iStreamBuffer) delete iStreamBuffer;
            iStreamBuffer = NULL; 
            iStreamBuffer = HBufC8::NewMaxL(iFrameSize * iFrameCount);
            iStreamStart=0;
            iStreamEnd=iFrameCount - 1;
            }   
        }
    TPtr8& CAudioStreamEngine::GetFrame(TUint aFrameIdx)
        {
          __ASSERT_ALWAYS(aFrameIdx < iFrameCount, 
                                        User::Panic(_L("AudioStreamEx"), 1));
          iFramePtr.Set((TUint8*)(iStreamBuffer->Ptr() + (aFrameIdx * iFrameSize)),iFrameSize,iFrameSize);
          return iFramePtr;
        }
    TPtr8& CAudioStreamEngine::GetPlaybackFrames(TUint aLastFrame)
        {
        __ASSERT_ALWAYS(aLastFrame < iFrameCount, 
                                    User::Panic(_L("AudioStreamEx"), 2));
        iFramePtr.Set((TUint8*)(iStreamBuffer->Ptr()),(aLastFrame + 1) * iFrameSize,(aLastFrame + 1) * iFrameSize);
        return iFramePtr;
        }
    void CAudioStreamEngine::MaiscOpenComplete(TInt aError)
        {
        if (aError==KErrNone) 
            {
            iInputStatus = EOpen;
    
            TRAPD(error, iInputStream->SetDataTypeL(iCurrentEncoding));
            PanicIfError(error);
    
            iInputStream->SetGain(iInputStream->MaxGain()); 
            iInputStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
            iStreamBuffer->Des().FillZ(iFrameCount * iFrameSize);
            iStreamIdx=0;
            TRAPD(error2, iInputStream->ReadL(GetFrame(iStreamIdx)));
            PanicIfError(error2);
            } 
        else 
            {iInputStatus = ENotReady;}
        }
    void CAudioStreamEngine::MaiscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
        {
        if (aError!=KErrNone)
            {
            _LIT(KMessage,"Recording error: %d");
            HBufC16* message = HBufC16::NewLC(KMessage().Length()+10);
            message->Des().AppendFormat(KMessage,aError);
            CleanupStack::PopAndDestroy(); 
            message = NULL;
            }
        if (aError==KErrNone) 
            {
            iStreamIdx++;
            if (iStreamIdx == iFrameCount)
                {
                iStreamEnd = iStreamIdx - 1;
                iBufferOK = ETrue;
                iStop->Start( TCallBack(BackgroundStop, this) );            
                return;
                }       
            TRAPD(error, iInputStream->ReadL(GetFrame(iStreamIdx)));
            PanicIfError(error);
            }
        else if (aError==KErrAbort) 
            {
            iStreamEnd = iStreamIdx - 1;
            iBufferOK = ETrue;
            iInputStatus = ENotReady;
            }
        else 
            {iInputStatus = ENotReady;}
        }
    TInt CAudioStreamEngine::BackgroundStop( TAny *aStream )
        {
        ((CAudioStreamEngine*)aStream)->Stop();
        return EFalse;
        }
    void CAudioStreamEngine::MaiscRecordComplete(TInt aError)
        {iInputStatus = ENotReady;}
    void CAudioStreamEngine::MaoscOpenComplete(TInt aError)
        {
        if (aError==KErrNone) 
            {
            iOutputStatus = EOpen;
            TRAPD(error, iOutputStream->SetDataTypeL(iCurrentEncoding));
            PanicIfError(error);
            iOutputStream->SetVolume(iOutputStream->MaxVolume()/2);
            iOutputStream->SetPriority(EPriorityNormal, 
                EMdaPriorityPreferenceTime);                
            if (iUseAMR)
                {
                iStreamIdx = iStreamEnd;
                TRAPD(error2, iOutputStream->WriteL(GetPlaybackFrames(iStreamEnd)));
                PanicIfError(error2);
                }
            else
                {
                iStreamIdx = 0;
                TRAPD(error3, iOutputStream->WriteL(GetFrame(iStreamIdx)));
                PanicIfError(error3);
                }
            }
        else 
            {iOutputStatus = ENotReady;}       
        }
    
    void CAudioStreamEngine::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
        {   
        if (aError==KErrNone) 
            {
            if (iStreamIdx==iStreamEnd)
                {iStop->Start( TCallBack(BackgroundStop, this) );}
            else 
                {
                iStreamIdx++;
                TRAPD(error, iOutputStream->WriteL(GetFrame(iStreamIdx)));  
                PanicIfError(error);
                }
            }
        else if (aError==KErrAbort) 
            {iOutputStatus = ENotReady;}
        else 
            {iOutputStatus = ENotReady;}
        }
    
    void CAudioStreamEngine::MaoscPlayComplete(TInt aError)
        { iOutputStatus = ENotReady;}
    
    void CAudioStreamEngine::MapcPlayComplete(TInt /*aError*/)
    {}
     
    void CAudioStreamEngine::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& /*aDuration*/)	
    {
    	if(aError == KErrNone)
    	{
    	iPlayUtility->SetVolume(iPlayUtility->MaxVolume());		
    	}
    }

  3. #3
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    AudioStreamEngine.h
    Code:
    /*
     * Copyright © 2008 Nokia Corporation.
     */
    
    #ifndef AUDIOSTREAMENGINE_H
    #define AUDIOSTREAMENGINE_H
    
    // INCLUDES
    #include <e32base.h>
    #include <aknviewappui.h> 
    
    #include <mda\common\audio.h>
    #include <MdaAudioInputStream.h>    // audio input stream
    #include <MdaAudioOutputStream.h>   // audio output stream
    
    #include "AudioStream.hrh"
    #include "AudioStreamView.h"    
    #include "AudioStreamAppUi.h"   
    #include "MdaAudioSamplePlayer.h"
    
    // FORWARD DECLARATIONS
    class CAudioStreamView;
    
    // CLASS DECLARATION
    
    class CAudioStreamEngine : public CBase, MMdaAudioInputStreamCallback, 
        MMdaAudioOutputStreamCallback, public MMdaAudioPlayerCallback
    {
    public:
    
        static CAudioStreamEngine* NewL(CAudioStreamAppUi* /* aAppUi */);
    
        static CAudioStreamEngine* NewLC(CAudioStreamAppUi* /* aAppUi */);
    
        ~CAudioStreamEngine();
            
    
    public: // New functions
        
        void Play();
    
        void Record();
    
        void Stop();
    
        void LoadAudioFileL();
    
        void SaveAudioFileL();
    
        void SetEncodingL(TBool aAmr);
        
    private: // in-class methods
    
        TPtr8& CAudioStreamEngine::GetFrame(TUint aFrameIdx);
    
        TPtr8& CAudioStreamEngine::GetPlaybackFrames(TUint aLastFrame);
    
        void ShowMessage(const TDesC& /* aMsg */, TBool /* aReset=false */);
        
        virtual void MaiscOpenComplete(TInt aError);
    
        virtual void MaiscBufferCopied(TInt aError, const TDesC8& aBuffer);
     
        virtual void MaiscRecordComplete(TInt aError);
    
        virtual void MaoscOpenComplete(TInt aError);
    
        virtual void MaoscBufferCopied(TInt aError, const TDesC8& aBuffer);
        
        virtual void MaoscPlayComplete(TInt aError);
    
        static TInt BackgroundStop( TAny *aStream );
           
    public: // Functions from base classes
    	void MarncResourceAvailable();
    	
    public: // from MMdaAudioToneObserver
    	virtual void MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration);
    	virtual void MapcPlayComplete(TInt aError);
    
    private: // Basic two-phase EPOC constructors
    
        void ConstructL();
     
        CAudioStreamEngine(CAudioStreamAppUi* /* aAppUi */);
    
    private:    
    
        // enumeration of input/output stream status
        enum TStatus
            {
            ENotReady,
            EOpen
            };
     
    private:    // data members
    
        // application UI object reference
        CAudioStreamAppUi* iAppUi;
    
        // audio input stream object reference
        CMdaAudioInputStream* iInputStream;
    
        // audio output stream object reference
        CMdaAudioOutputStream* iOutputStream;
        CMdaAudioPlayerUtility* iPlayUtility;
    
        // Handle to CCoeEnv's file server
        RFs iFs;
    
        // Do we use AMR-NB encoding?
        TBool iUseAMR;
        // The path to the sample audio file (sample.aud or sample.amr)
        TFileName iAudioFilePath;
        // The audio file to be used (sample.aud or sample.amr)
        TFileName iAudioFile;   
        // The frame size for the current encoding
        TUint iFrameSize;
        // The number of frames to be buffered
        TUint iFrameCount;
    
        // A buffer containing the audio frames
        HBufC8* iStreamBuffer;  
        // Modifiable pointer used to reference a single frame in iStreamBuffer 
        // while recording, and all the valid frames in iStreamBuffer while playback (the
        // iStreamBuffer might not always be fully recorded in this example).
        TPtr8 iFramePtr;
        // Buffer status (does it contain valid audio data)
        TBool iBufferOK;
        // The default encoding used by the platform
        TFourCC iDefaultEncoding;
        // The encoding we are currently using
        TFourCC iCurrentEncoding;
    
        // Audio data stream settings for input and output streams
        TMdaAudioDataSettings iStreamSettings;
        // Status enumeration of input stream
        TStatus iInputStatus;
        // Status enumeration of output stream  
        TStatus iOutputStatus;
        // Index of audio data block currently being played/recorded on the buffer
        TUint iStreamIdx;
        // Application status message displayed to user
        TBuf<255> iMsg;
        // Stream start (first audio block in buffer) and end index
        TUint iStreamStart;
        TUint iStreamEnd;
        
        CIdle* iStop;
        
    };
    
    #endif // AUDIOSTREAMENGINE_H

  4. #4
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    Good Morning.

    No anybody here for give me any solution or nobodies worked on audio streaming?

    please give me a solution? it's very urgent for me.

    Regards,
    SymbianTH

  5. #5
    Super Contributor
    Join Date
    Jul 2007
    Posts
    596

    Re: How play Stream audio file from internet?

    What is the error code u r getting ????

  6. #6
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    Hi

    Thanks for reply,

    i changed my code i will post error and change code in few minutes.

    Sorry for this.

    Regards,
    SymbianTH

  7. #7
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    Give me a -5 error.

    Code:
    AppUi
    -----
    void CAudioStreamAppUi::HandleCommandL(TInt aCommand)
        {
        switch ( aCommand )
            {
            case EAudioStreamCmdPlay:
                {
                iAudioPlayer = CAudioPlayerAdaptor::NewLC(this);
                iAudioPlayer->iWantToPlay = ETrue;
                iAudioPlayer->StartPlay();
                break;
                }
            default:
                break;      
            }
        }
    
    AudioPlayerAdaptor.cpp
    ----------------------
    #include "AudioPlayerAdaptor.h"
    
    _LIT(KErrorSetLabel, "Error setting label");
    #ifdef __WINSCW__
    const TInt KMaxSound(65535);
    #else
    const TInt KMaxSound(100);
    #endif
    
    
    CAudioPlayerAdaptor* CAudioPlayerAdaptor::NewLC(CAudioStreamAppUi* aAppUi)
      {
      CAudioPlayerAdaptor* self = new (ELeave) CAudioPlayerAdaptor(aAppUi);
      CleanupStack::PushL(self);
      self->ConstructL();
      return self;
      }
    
    CAudioPlayerAdaptor::~CAudioPlayerAdaptor()
      {
      PlayCleanup();
      }
    
    void CAudioPlayerAdaptor::SetFileL()
      {
      
      }
    
    void CAudioPlayerAdaptor::StartPlay()
      {
      if(iState == EIdle && iWantToPlay)
        {
        //iAuPlayUtil->RegisterForAudioLoadingNotification(*this);
        //TRAPD(err, iAuPlayUtil = CMdaAudioPlayerUtility::NewFilePlayerL(iAuFilePath,*this));
        TRAPD(err, iAuPlayUtil = CMdaAudioPlayerUtility::NewL(*this));
        
        if(err)
          {
          ShowError(err);
          return;
          }
        
        iState = EPrepare;
        iWantToPlay = ETrue;
        iAuPlayUtil->OpenUrlL(_L("rtsp://rmlivev8.bbc.net.uk/farm/*/ev7/live24/worldservice/livenews_v8.ra"));
        User::InfoPrint(_L("Play"));
        }
      else if(iState == EPaused && iWantToPlay)
        {
        iAuPlayUtil->Play();
        iState = EPlaying;
        User::InfoPrint(_L("Play"));
        }
      }
    
    void CAudioPlayerAdaptor::PausePlay()
      {
      if(iState == EPlaying)
        {
        iAuPlayUtil->Pause();
        iState = EPaused;
        User::InfoPrint(_L("Pause"));
        }
      }
    
    void CAudioPlayerAdaptor::StopPlay()
      {
      if(iAuPlayUtil)
        {
        iAuPlayUtil->Stop();
        iAuPlayUtil->Close();
        }
      PlayCleanup();
      iState = EIdle;
      iWantToPlay = EFalse;
      User::InfoPrint(_L("Stop"));
      }
    
    void CAudioPlayerAdaptor::ViewConstructL()
      {
      iAuFolderPath = KInitFolderPath;
      iAuFilePath = KInitAudioPath;
      }
    
    
    CAudioPlayerAdaptor::CAudioPlayerAdaptor(CAudioStreamAppUi* aAppUi)
      : iAuPlayUtil(0), iVolume(KMaxSound), iState(EIdle), iDialogLock(EFalse),
      iAuFolderPath(0), iAuFilePath(0), iWantToPlay(EFalse)
      {
      }
    
    void CAudioPlayerAdaptor::ConstructL()
      {
       iAuFolderPath = KInitFolderPath;
       iAuFilePath = KInitAudioPath;
      }
    
    void CAudioPlayerAdaptor::MapcInitComplete(TInt aError,
                                                const TTimeIntervalMicroSeconds& /*aDuration*/)
      {
      if(aError != KErrNone) //Give me aError = -5 error.
        {
        TBuf<20> errBuf;
        errBuf.Num(aError);
        PlayCleanup();
        }
      else
        {
        iAuPlayUtil->SetVolume(iVolume);
        iAuPlayUtil->Play();
        iState = EPlaying;
        }
      }
    
    void CAudioPlayerAdaptor::MapcPlayComplete(TInt aError)
      {
      if(aError != KErrNone)
        {
        TBuf<20> errBuf;
        errBuf.Num(aError);
        }
      PlayCleanup();
      }
    
    void CAudioPlayerAdaptor::PlayCleanup()
      {
      if(iAuPlayUtil)
        {
        delete iAuPlayUtil;
        iAuPlayUtil = NULL;
        }
      iState = EIdle;
      iWantToPlay = EFalse;
      }
    
    void CAudioPlayerAdaptor::ShowError(TInt aErr)
      {
      _LIT(KErrInfo, "Err: %d");
      TBuf<20> errInfo;
      errInfo.Format(KErrInfo, aErr);
      User::InfoPrint(errInfo);
      }
    
    void CAudioPlayerAdaptor::MaloLoadingStarted()
    	{}
    
    void CAudioPlayerAdaptor::MaloLoadingComplete()
    	{}

  8. #8
    Super Contributor
    Join Date
    Mar 2004
    Location
    Bangalore,India
    Posts
    2,146

    Re: How play Stream audio file from internet?

    -5 is not supported, could just be that rtsp as a protocol for audio files might not be supported?

    Cheers,
    Mayank

  9. #9
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    Hi

    Thanks for your replay.

    Than how it's possible have you any idea? than please help me.
    Is it possible in another way or supported another server for play streaming audio file?

    Thanks
    SymbianTH

  10. #10
    Regular Contributor
    Join Date
    Apr 2009
    Posts
    442

    Re: How play Stream audio file from internet?

    Hi

    Please help me and please trying to solve from following code that where is the my problem why i am not able to play audio file from rtsp server.

    rtsp link work in real player, but in code give me a -5 error.

    please help me, i also tried to find solution in google but result is nothing, many people face this (-5) problem but nobody gives to solution.

    Regards
    SymbianTH

Similar Threads

  1. Problem with pyobfuscate
    By JOM in forum Symbian
    Replies: 3
    Last Post: 2008-06-20, 22:47
  2. double buffer for stream and play audio in J2ME
    By cibenxs in forum Mobile Java General
    Replies: 0
    Last Post: 2008-06-12, 11:22
  3. Half Duplex Audio Streaming
    By subhrajyotisaha in forum Symbian Media (Closed)
    Replies: 0
    Last Post: 2006-05-25, 04:39
  4. nokia 7210 modem via IR doesn't work !
    By oussamaaiadi in forum PC Suite API and PC Connectivity SDK
    Replies: 1
    Last Post: 2003-03-06, 10:46
  5. Replies: 0
    Last Post: 2002-06-10, 12:24

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
×