internetradio2.0/streamsourceinc/iricyflowreader.h
changeset 0 09774dfdd46b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/streamsourceinc/iricyflowreader.h	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,342 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Reads data from opened ICY session
+*
+*/
+
+
+/* ---------------------------------------------------------------------------
+*  Version history:
+*  Template version:
+*  <ccm_history>
+*
+*  Version: 2, Tue Feb 28 18:00:00 2008 by Rohit/Kranthi
+*  Ref:
+*  Added NetworkController instance for Byte Counter Impl
+*
+*  </ccm_history>
+* ============================================================================
+*/
+
+#ifndef IR_IRICYFLOWREADER
+#define IR_IRICYFLOWREADER
+
+
+#include <e32base.h>
+#include <es_sock.h>
+
+class CIRMetaData;
+class CIRNetworkBuffer;
+class CIRStationConnection;
+class MIRStationDataObserver;
+class RSocket;
+class TChannelInfo;
+class CIRNetworkController;
+
+/**
+*  This class handles reading audio and metadata from a connected
+* ICY session. It assumes that the socket is connected, the
+* ICY session has been requested and initial ICY headers have been
+* processed.
+*
+*/
+NONSHARABLE_CLASS( CIRIcyFlowReader ) : public CActive
+    {
+public: // Constructors and destructors
+
+    /**
+     * Standard Symbian two-phase construction
+     *
+     * @param aSocket       Socket to be read.
+     * @param aOwner        The owner of this CIRIcyFlowReader
+     * @param aDataObserver The observer wishing to receive audio/metadata.
+     * @param aChannelInfo  Information describing the ICY session
+     * @return Instance of CIRIcyFlowReader
+     */
+	static CIRIcyFlowReader* NewL( RSocket& aSocket, CIRStationConnection& aOwner,
+	                               MIRStationDataObserver& aDataObserver, 
+	                               TChannelInfo& aChannelInfo );
+
+    /**
+     * Destructor
+     */
+	~CIRIcyFlowReader();
+
+public:
+
+	/**
+	 * Starts the reading from the socket
+	 */
+	void Start();
+
+	/**
+     * Fills the buffer with the streamed data
+     *
+     * @param aInputBuffer Buffer into which audio data is to be copied
+     */
+	void FillBuffer(TDes8& aInputBuffer);
+
+private: // Functions from base classes
+
+	/**
+	 * From CActive
+	 */
+	void RunL();
+
+	/**
+	 * From CActive
+	 */
+	void DoCancel();
+
+private:
+	/**
+	 * Copies the buffer to the mediaengine sink queue
+	 *
+	 * @param aData Data to copy.
+	 */
+	void AddToSinkQueue( const TDesC8& aData );
+
+	/**
+	 * Fills the media engine buffer with audio data upon request
+	 * by the media engine
+	 *
+	 * @param aInputBuffer Buffer into which audio data is to be copied
+	 */
+	void FillMediaEngineBuffer(const TDes8& aInputBuffer);
+
+	/**
+     * Fills the unfilled media engine buffers with the remaining audio data
+     */
+	void FillRemainingBuffers();
+
+	/**
+     * C++ default constructor
+     */
+	CIRIcyFlowReader( RSocket& aSocket, CIRStationConnection& aOwner,
+  	                  MIRStationDataObserver& aDataObserver, TChannelInfo& aChannelInfo );
+
+    /**
+     * Second phase construction
+     */
+	void ConstructL();
+
+private:
+
+    /**
+     * The parsing states
+     */
+    enum TIRParsingState
+        {
+        EIRReadingAudioData,        /**< Reading raw audio data. */
+        EIRReadingMetaDataLength,   /**< Reading the length of the meta data. */
+        EIRReadingMetaData          /**< Reading meta data. */
+        };
+
+	/**
+	 * Initiates a read from socket.
+	 */
+	void IssueRead();
+
+	/**
+     * Initializes the buffers that will be used for streaming
+     */
+	void InitializeBuffersL();
+
+	/**
+     * Extracts the meta data from the stream
+     */
+	void ExtractMetadataL();
+
+    /**
+     * Handles received data.
+     *
+     * Can contain any amount of audio and/or meta data mixed in with it.
+     *
+     * @param aData Data received.
+     */
+    void HandleReceivedDataL( const TDesC8& aData );
+
+    /**
+     * Handles received audio data.
+     *
+     * Can only contain raw audio data.
+     *
+     * @param aData Data received.
+     */
+    void HandleReceivedAudioData( const TDesC8& aData );
+
+    /**
+     * Handles received meta data.
+     *
+     * Can only contain meta data.
+     *
+     * @param aData Data received.
+     */
+    void HandleReceivedMetaData( const TDesC8& aData );
+    /**
+     * Recognizes if the string is UTF-8 encoded and decodes it,
+     * if required.
+     * 
+     * @param aString The string to be decoded.
+     * @return The string in Unicode/ISO-8859-1 format.
+     */
+    HBufC* DecodeMetadataStringLC( const TDesC8& aString ) const;
+    
+    /**
+     * Tests whether the string is UTF-8 encoded.
+     * 
+     * @param aString The string to be examined
+     * @return ETrue, if the string is UTF-8 encoded, EFalse otherwise. 
+     */
+    TBool IsUtf8Encoded( const TDesC8& aString ) const;
+
+private:
+
+	/**
+	 * The pointer to buffer which holds the audio data.
+	 * Owned.
+	 */
+	TUint8* iSongBuffer;
+
+	/**
+	 * Buffer that holds the data received over the network.
+	 * Owned.
+	 */
+	HBufC8* iSocketBuffer;
+
+    /**
+     * Buffer to contain unfinished song data.
+     * Owned.
+     */
+    HBufC8* iTempSongBuffer;
+
+    /**
+     * Buffer to contain unfinished meta data.
+     * Owned.
+     */
+    HBufC8* iTempMetaBuffer;
+
+    /**
+     * Current meta data information.
+     * Owned.
+     */
+    CIRMetaData* iMetaData;
+
+    /**
+	 * The socket that read.
+	 */
+    RSocket& iSocket;
+
+    /**
+     * The owner of this object in the whole-part relation.
+     */
+    CIRStationConnection& iOwner;
+
+    /**
+     * The observer wishing to receive audio/metadata
+     */
+    MIRStationDataObserver& iDataObserver;
+
+	/**
+	 * Queue of buffer which is filled
+	 */
+	TSglQue<CIRNetworkBuffer> iSourceQ;
+
+	/**
+	 * Queue of buffer which is empty
+	 */
+	TSglQue<CIRNetworkBuffer> iSinkQ;
+
+	/**
+	 * Temporary holder for network buffer.
+	 * Not owned.
+	 */
+	CIRNetworkBuffer* iTempBufferHolder;
+
+    /**
+     * Pointer descriptor to the network data buffer.
+     */
+    TPtr8 iSocketBufferPtr;
+
+	/**
+	 * Indicates the no. of bytes read from the socket
+     */
+	TSockXfrLength iSocketBytesRead;
+
+	/**
+	 * Indicates that stream source ( network side ) buffering is happening.
+	 */
+	TBool iInitialBuffering;
+
+	/**
+	 * Indicates rebuffering is occurring
+	 */
+	TBool iReBuffering;
+
+	/**
+	 * Indicates no of chunks of buffers to be copied
+	 */
+	TInt iNoOfChunks;
+
+	/**
+	 * Indicates the number of chunks are remaining
+	 */
+	TInt iChunksRemaining;
+
+    /**
+     * Length of the current meta data block in bytes.
+     */
+    TInt iMetaDataLength;
+
+	/**
+	 * Pointer to buffer to be filled.
+	 * Not owned.
+	 */
+	TUint8* iBufferFillPointer;
+
+	/**
+	 * Used to give buffer fill value to progress bar
+	 */
+	TInt iBufferCounter;
+
+	/**
+	 * Used to determine the metadata position
+	 */
+	TInt iAudioDataOffset;
+
+	/**
+	 * Indicates the data parsing state.
+	 */
+	TIRParsingState iParsingState;
+
+	/**
+	 * Holds the channel information
+	 */
+	TChannelInfo& iChannelInfo;
+
+	/**
+	 * Indicates if the channel info should be published or not
+	 */
+	TBool iPublishStationInfo;
+
+	/**
+	 * NetworkController singleton instance
+	 */
+	CIRNetworkController* iNetworkControllerHandle;
+	};
+
+#endif // IR_IRICYFLOWREADER
+
+
+