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

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: asap.c 543 2006-01-07 22:06:24Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common/common.h"
  24. #include "asapfmt.h"
  25. #include "asap/asap.h"
  26. #define SAMPLE_RATE 44100
  27. #define BUFFER_SIZE 4096
  28. typedef struct asap 
  29. {
  30. format_base Format;
  31. int Samples;
  32. int Total;
  33. int SamplePerBuffer;
  34. void* Buffer;
  35. } asap;
  36. static bool_t Load(asap* p)
  37. {
  38. format_reader* Reader = p->Format.Reader;
  39. char Path8[MAXPATH];
  40. tchar_t Path[MAXPATH];
  41. void* buf;
  42. int n = p->Format.FileSize;
  43. if (n<=0) n=65536;
  44. buf = malloc(n);
  45. if (!buf) return 0;
  46. Reader->Input->Get(Reader->Input,STREAM_URL,Path,sizeof(Path));
  47. TcsToStr(Path8,sizeof(Path8),Path);
  48. n = Reader->Read(Reader,buf,n);
  49. n = ASAP_Load(Path8, buf, n);
  50. free(buf);
  51. if (!n)
  52. return 0;
  53. ASAP_PlaySong(ASAP_GetDefSong());
  54. p->Samples = 0;
  55. return 1;
  56. }
  57. static int Init(asap* p)
  58. {
  59. format_stream* s;
  60. p->Format.HeaderLoaded = 1;
  61. p->Format.TimeStamps = 0;
  62. p->Format.Duration = 60*5*TICKSPERSEC;
  63. p->Total = Scale(p->Format.Duration,SAMPLE_RATE,TICKSPERSEC);
  64. ASAP_Initialize(SAMPLE_RATE, AUDIO_FORMAT_S16_NE, 3);
  65. if (!Load(p))
  66. return ERR_NOT_SUPPORTED;
  67. p->Buffer = malloc(BUFFER_SIZE);
  68. if (!p->Buffer)
  69. return ERR_OUT_OF_MEMORY;
  70. s = Format_AddStream(&p->Format,sizeof(format_stream));
  71. if (!s)
  72. return ERR_OUT_OF_MEMORY;
  73. PacketFormatClear(&s->Format);
  74. s->Format.Type = PACKET_AUDIO;
  75. s->Format.Format.Audio.Format = AUDIOFMT_PCM;
  76. s->Format.Format.Audio.Bits = 16;
  77. s->Format.Format.Audio.SampleRate = SAMPLE_RATE;
  78. s->Format.Format.Audio.Channels = ASAP_GetChannels();
  79. PacketFormatDefault(&s->Format);
  80. s->Fragmented = 1;
  81. s->DisableDrop = 1;
  82. p->SamplePerBuffer = BUFFER_SIZE/2/s->Format.Format.Audio.Channels;
  83. Format_PrepairStream(&p->Format,s);
  84. return ERR_NONE;
  85. }
  86. static void Done(asap* p)
  87. {
  88. free(p->Buffer);
  89. p->Buffer = NULL;
  90. }
  91. static int Seek(asap* p, tick_t Time, int FilePos, bool_t PrevKey)
  92. {
  93. if (Time>0 || FilePos>0)
  94. return ERR_NOT_SUPPORTED;
  95. if (Format_Seek(&p->Format,0,SEEK_SET) != ERR_NONE)
  96. return ERR_NOT_SUPPORTED;
  97. Load(p);
  98. return ERR_NONE;
  99. }
  100. static int Process(asap* p,format_stream* Stream)
  101. {
  102. int Result = ERR_NONE;
  103. if (Stream->Pending)
  104. {
  105. Result = Format_Send(&p->Format,Stream);
  106. if (Result == ERR_BUFFER_FULL || Result == ERR_SYNCED)
  107. return Result;
  108. }
  109. if (p->Samples >= p->Total)
  110. return Format_CheckEof(&p->Format,Stream);
  111. ASAP_Generate(p->Buffer, BUFFER_SIZE);
  112. Stream->Packet.RefTime = Scale(p->Samples,TICKSPERSEC,SAMPLE_RATE);
  113. Stream->Packet.Data[0] = p->Buffer;
  114. Stream->Packet.Length = BUFFER_SIZE;
  115. Stream->Pending = 1;
  116. p->Samples += p->SamplePerBuffer;
  117. Result = Format_Send(&p->Format,Stream);
  118. if (Result == ERR_BUFFER_FULL || Result == ERR_NEED_MORE_DATA)
  119. Result = ERR_NONE;
  120. return Result;
  121. }
  122. static int Create(asap* p)
  123. {
  124. p->Format.Init = (fmtfunc) Init;
  125. p->Format.Done = (fmtvoid) Done;
  126. p->Format.Seek = (fmtseek) Seek;
  127. p->Format.Process = (fmtstreamprocess) Process;
  128. p->Format.FillQueue = NULL;
  129. p->Format.ReadPacket = NULL;
  130. p->Format.Sended = NULL;
  131. return ERR_NONE;
  132. }
  133. static const nodedef ASAPDef =
  134. {
  135. sizeof(asap),
  136. ASAP_ID,
  137. FORMATBASE_CLASS,
  138. PRI_DEFAULT,
  139. (nodecreate)Create,
  140. };
  141. void ASAP_Init()
  142. {
  143. NodeRegisterClass(&ASAPDef);
  144. }
  145. void ASAP_Done()
  146. {
  147. NodeUnRegisterClass(ASAP_ID);
  148. }