00001 #ifndef _AmJitterBuffer_h_
00002 #define _AmJitterBuffer_h_
00003
00004 #include "amci/amci.h"
00005 #include "AmThread.h"
00006 #include "SampleArray.h"
00007
00008 #define INITIAL_JITTER 640 // 80 miliseconds
00009 #define MAX_JITTER 16000 // 2 seconds
00010 #define RESYNC_THRESHOLD 2
00011
00012 class Packet
00013 {
00014 int16_t m_data[AUDIO_BUFFER_SIZE*2];
00015 uint32_t m_size;
00016 uint32_t m_ts;
00017 public:
00018 Packet *m_next;
00019 Packet *m_prev;
00020 void init(const int16_t *data, uint32_t size, uint32_t ts);
00021
00022 uint32_t size() const { return m_size; }
00023 uint32_t ts() const { return m_ts; }
00024 int16_t *data() { return m_data; }
00025
00026 bool operator < (const Packet&) const;
00027 };
00028
00029 class PacketAllocator
00030 {
00031 private:
00032 Packet m_packets[MAX_JITTER / 80];
00033 Packet *m_free_packets;
00034
00035 public:
00036 PacketAllocator();
00037 Packet *alloc(const int16_t *data, uint32_t size, uint32_t ts);
00038 void free(Packet *p);
00039 };
00040
00041 class AmJitterBuffer
00042 {
00043 private:
00044 AmMutex m_mutex;
00045 PacketAllocator m_allocator;
00046 Packet *m_head;
00047 Packet *m_tail;
00048 bool m_tsInited;
00049 uint32_t m_lastTs;
00050 uint32_t m_lastResyncTs;
00051 uint32_t m_lastAudioTs;
00052 uint32_t m_tsDelta;
00053 bool m_tsDeltaInited;
00054 int m_delayCount;
00055 uint32_t m_jitter;
00056
00057 bool m_forceResync;
00058
00059 #ifdef DEBUG_PLAYOUTBUF
00060 uint32_t m_tsDeltaStart;
00061 #endif
00062
00063 public:
00064 AmJitterBuffer();
00065 void put(const int16_t *data, uint32_t size, uint32_t ts, bool begin_talk);
00066 bool get(uint32_t ts, uint32_t ms, int16_t *out, uint32_t *size, uint32_t *out_ts);
00067 };
00068
00069 #endif