tta.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:5k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: mpc.c 543 2006-01-07 22:06:24Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2006 Jory 'jcsston' Stone
  21.  *
  22.  ****************************************************************************/
  23.  
  24. #include "../common/common.h"
  25. #include "tta.h"
  26. #include "ttalib/ttalib.h"
  27. typedef struct tta 
  28. {
  29. format_base Format;
  30. tta_info Decoder;
  31. uint8_t* Buffer;
  32.   int BufferLen;
  33.   int BufferFilled;
  34. int SampleRate;
  35. int SampleSize;
  36. int64_t Samples;
  37. } tta;
  38. static void Done(tta* p)
  39. {
  40. free(p->Buffer);
  41. p->Buffer = NULL;
  42.   close_tta_file(&p->Decoder);
  43.   player_stop();
  44. }
  45. static int Init(tta* p)
  46. {
  47.   int ret;
  48. format_stream* s;
  49. p->Format.HeaderLoaded = 1;
  50. p->Format.TimeStamps = 0;
  51.   p->Decoder.Reader = p->Format.Reader;
  52.   ret = open_tta_file(&p->Decoder, 0);
  53.   if (ret != 0)
  54.     return ERR_INVALID_DATA;
  55.   ret = player_init(&p->Decoder);
  56.   if (ret != 0)
  57.     return ERR_INVALID_DATA;
  58. p->Samples = 0;
  59. s = Format_AddStream(&p->Format,sizeof(format_stream));
  60. if (s)
  61. {
  62. PacketFormatClear(&s->Format);
  63. s->Format.Type = PACKET_AUDIO;
  64. s->Format.Format.Audio.Format = AUDIOFMT_PCM;
  65. s->Format.Format.Audio.Bits = p->Decoder.BPS;
  66. s->Format.Format.Audio.SampleRate = p->Decoder.SAMPLERATE;
  67. s->Format.Format.Audio.Channels = p->Decoder.NCH;
  68. PacketFormatDefault(&s->Format);
  69. s->Format.ByteRate = (int)p->Decoder.BITRATE * 125;
  70. s->PacketBurst = 1;
  71. s->Fragmented = 1;
  72. s->DisableDrop = 1;
  73. p->Format.Duration = (tick_t)(((int64_t)p->Decoder.DATALENGTH * TICKSPERSEC) / s->Format.Format.Audio.SampleRate);
  74. Format_PrepairStream(&p->Format,s);
  75. if (p->Format.Comment.Node)
  76. {
  77.       // id3v1
  78.       format_reader* Reader = p->Format.Reader;
  79.       char Buffer[ID3V1_SIZE];
  80.       filepos_t Save = Reader->Input->Seek(Reader->Input,0,SEEK_CUR);
  81.       if (Save>=0 && Reader->Input->Seek(Reader->Input,-(int)sizeof(Buffer),SEEK_END)>=0)
  82.       {
  83.         if (Reader->Input->Read(Reader->Input,Buffer,sizeof(Buffer)) == sizeof(Buffer))
  84.           ID3v1_Parse(Buffer,&p->Format.Comment);
  85.         Reader->Input->Seek(Reader->Input,Save,SEEK_SET);
  86.       }
  87. }
  88.     p->SampleRate = s->Format.Format.Audio.SampleRate;
  89.     p->SampleSize = p->Decoder.BSIZE * s->Format.Format.Audio.Channels;
  90. }
  91.   p->BufferLen = PCM_BUFFER_LENGTH;
  92.   p->Buffer = (uint8_t*)malloc(p->SampleSize*p->BufferLen);
  93.   if (!p->Buffer)
  94.     return ERR_OUT_OF_MEMORY;
  95. return ERR_NONE;
  96. }
  97. static int Seek(tta* p, tick_t Time, int FilePos, bool_t PrevKey)
  98. {
  99. int64_t Samples;
  100.   unsigned int Pos;
  101. if (Time < 0)
  102. {
  103. if (FilePos<0 || p->Format.FileSize<0)
  104. return ERR_NOT_SUPPORTED;
  105. Time = Scale(FilePos,p->Format.Duration,p->Format.FileSize);
  106. }
  107. Samples = ((int64_t)Time * p->SampleRate+(TICKSPERSEC/2)) / TICKSPERSEC;
  108.   Pos = (unsigned int)((int64_t)Time * 1000 / TICKSPERSEC / SEEK_STEP);
  109. if (set_position(Pos))
  110. return ERR_NOT_SUPPORTED;
  111. Format_AfterSeek(&p->Format);
  112. p->Samples = Samples;
  113. return ERR_NONE;
  114. }
  115. static int Process(tta* p,format_stream* Stream)
  116. {
  117. int Result = ERR_NONE;
  118. int No,Burst;
  119. if (Stream->Pending)
  120. {
  121. Result = Format_Send(&p->Format,Stream);
  122. if (Result == ERR_BUFFER_FULL || Result == ERR_SYNCED)
  123. return Result;
  124. }
  125. Burst = Stream->PacketBurst;
  126. for (No=0;No<Burst;++No)
  127. {
  128. if (p->Format.Reader[0].BufferAvailable < (MINBUFFER/2) && 
  129. !p->Format.Reader[0].NoMoreInput)
  130. return ERR_NEED_MORE_DATA;
  131.     p->BufferFilled = get_samples(p->Buffer);
  132.     if (p->BufferFilled == -1)
  133. return ERR_INVALID_DATA;
  134. if (p->BufferFilled == 0)
  135. return Format_CheckEof(&p->Format,Stream);
  136. Stream->Packet.RefTime = (tick_t)((p->Samples * TICKSPERSEC) / p->SampleRate);
  137. Stream->Packet.Data[0] = p->Buffer;
  138. Stream->Packet.Length = p->BufferFilled * p->SampleSize;
  139. Stream->Pending = 1;
  140. p->Samples += p->BufferFilled;
  141. Result = Format_Send(&p->Format,Stream);
  142. if (Result == ERR_BUFFER_FULL || Result == ERR_SYNCED)
  143. break;
  144. }
  145. if (Result == ERR_BUFFER_FULL || Result == ERR_NEED_MORE_DATA)
  146. Result = ERR_NONE;
  147. return Result;
  148. }
  149. static int Create(tta* p)
  150. {
  151. p->Format.Init = (fmtfunc) Init;
  152. p->Format.Done = (fmtvoid) Done;
  153. p->Format.Seek = (fmtseek) Seek;
  154. p->Format.Process = (fmtstreamprocess) Process;
  155. p->Format.FillQueue = NULL;
  156. p->Format.ReadPacket = NULL;
  157. p->Format.Sended = NULL;
  158. return ERR_NONE;
  159. }
  160. static const nodedef TTA =
  161. {
  162. sizeof(tta),
  163. TTA_ID,
  164. FORMATBASE_CLASS,
  165. PRI_DEFAULT,
  166. (nodecreate)Create,
  167. };
  168. void TTA_Init()
  169. {
  170. NodeRegisterClass(&TTA);
  171. }
  172. void TTA_Done()
  173. {
  174. NodeUnRegisterClass(TTA_ID);
  175. }