Easy playback library for AUDIO_GRBoard.

Dependents:   GR-PEACH_Audio_WAV_PwmOut GR-Boards_Audio_WAV

Committer:
dkato
Date:
Tue Jul 24 08:45:30 2018 +0000
Revision:
2:6c46c61630b3
Parent:
1:fdd79b99ba73
Add PwmOutSpeaker to output

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 1:fdd79b99ba73 1 /* mbed EasyDec_Mov Library
dkato 1:fdd79b99ba73 2 * Copyright (C) 2018 dkato
dkato 1:fdd79b99ba73 3 *
dkato 1:fdd79b99ba73 4 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 1:fdd79b99ba73 5 * you may not use this file except in compliance with the License.
dkato 1:fdd79b99ba73 6 * You may obtain a copy of the License at
dkato 1:fdd79b99ba73 7 *
dkato 1:fdd79b99ba73 8 * http://www.apache.org/licenses/LICENSE-2.0
dkato 1:fdd79b99ba73 9 *
dkato 1:fdd79b99ba73 10 * Unless required by applicable law or agreed to in writing, software
dkato 1:fdd79b99ba73 11 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 1:fdd79b99ba73 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 1:fdd79b99ba73 13 * See the License for the specific language governing permissions and
dkato 1:fdd79b99ba73 14 * limitations under the License.
dkato 1:fdd79b99ba73 15 */
dkato 1:fdd79b99ba73 16
dkato 1:fdd79b99ba73 17 #include "EasyDec_Mov.h"
dkato 1:fdd79b99ba73 18
dkato 1:fdd79b99ba73 19 #define FourConstant(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
dkato 1:fdd79b99ba73 20
dkato 1:fdd79b99ba73 21 #ifndef htonl
dkato 1:fdd79b99ba73 22 # define htonl(x) __REV(x)
dkato 1:fdd79b99ba73 23 #endif
dkato 1:fdd79b99ba73 24 #ifndef ntohl
dkato 1:fdd79b99ba73 25 # define ntohl(x) __REV(x)
dkato 1:fdd79b99ba73 26 #endif
dkato 1:fdd79b99ba73 27
dkato 1:fdd79b99ba73 28 uint8_t * EasyDec_Mov::_videoBuf = NULL;
dkato 1:fdd79b99ba73 29 uint32_t EasyDec_Mov::_videoBufSize = 0;
dkato 1:fdd79b99ba73 30 Callback<void()> EasyDec_Mov::_function = NULL;
dkato 1:fdd79b99ba73 31
dkato 1:fdd79b99ba73 32 void EasyDec_Mov::attach(Callback<void()> func, uint8_t * video_buf, uint32_t video_buf_size) {
dkato 1:fdd79b99ba73 33 _function = func;
dkato 1:fdd79b99ba73 34 _videoBuf = video_buf;
dkato 1:fdd79b99ba73 35 _videoBufSize = video_buf_size;
dkato 1:fdd79b99ba73 36 }
dkato 1:fdd79b99ba73 37
dkato 1:fdd79b99ba73 38 bool EasyDec_Mov::AnalyzeHeder(char* p_title, char* p_artist, char* p_album, uint16_t tag_size, FILE* fp) {
dkato 1:fdd79b99ba73 39 Buffer buf;
dkato 1:fdd79b99ba73 40
dkato 1:fdd79b99ba73 41 if (fp == NULL) {
dkato 1:fdd79b99ba73 42 return false;
dkato 1:fdd79b99ba73 43 }
dkato 1:fdd79b99ba73 44 if (p_title != NULL) {
dkato 1:fdd79b99ba73 45 p_title[0] = '\0';
dkato 1:fdd79b99ba73 46 }
dkato 1:fdd79b99ba73 47 if (p_artist != NULL) {
dkato 1:fdd79b99ba73 48 p_artist[0] = '\0';
dkato 1:fdd79b99ba73 49 }
dkato 1:fdd79b99ba73 50 if (p_album != NULL) {
dkato 1:fdd79b99ba73 51 p_album[0] = '\0';
dkato 1:fdd79b99ba73 52 }
dkato 1:fdd79b99ba73 53
dkato 1:fdd79b99ba73 54 mov_fp = fp;
dkato 1:fdd79b99ba73 55 availableCount = bufSize;
dkato 1:fdd79b99ba73 56
dkato 1:fdd79b99ba73 57 frameSizesP = frameSizes;
dkato 1:fdd79b99ba73 58 audioSizesP = audioSizes;
dkato 1:fdd79b99ba73 59
dkato 1:fdd79b99ba73 60 search(htonl(FourConstant('s', 't', 's', 'z')));
dkato 1:fdd79b99ba73 61 fseek(mov_fp, 8, SEEK_CUR);
dkato 1:fdd79b99ba73 62 fread(&buf, sizeof(Buffer), 1, mov_fp);
dkato 1:fdd79b99ba73 63 numOfFrames = htonl(buf.value);
dkato 1:fdd79b99ba73 64 stszAddress = ftell(mov_fp);
dkato 1:fdd79b99ba73 65 fread(&buf, sizeof(Buffer), 1, mov_fp);
dkato 1:fdd79b99ba73 66
dkato 1:fdd79b99ba73 67 search(htonl(FourConstant('s', 't', 'c', 'o')));
dkato 1:fdd79b99ba73 68 fseek(mov_fp, 4, SEEK_CUR);
dkato 1:fdd79b99ba73 69 fread(&buf, sizeof(Buffer), 1, mov_fp);
dkato 1:fdd79b99ba73 70 if (numOfFrames != htonl(buf.value)) {
dkato 1:fdd79b99ba73 71 return false;
dkato 1:fdd79b99ba73 72 }
dkato 1:fdd79b99ba73 73 fread(&buf, sizeof(Buffer), 1, mov_fp);
dkato 1:fdd79b99ba73 74 stcoAddress = ftell(mov_fp);
dkato 1:fdd79b99ba73 75 lastFrameAddress = htonl(buf.value);
dkato 1:fdd79b99ba73 76
dkato 1:fdd79b99ba73 77 fillCaches();
dkato 1:fdd79b99ba73 78
dkato 1:fdd79b99ba73 79 _video_flg = true;
dkato 1:fdd79b99ba73 80
dkato 1:fdd79b99ba73 81 return true;
dkato 1:fdd79b99ba73 82 }
dkato 1:fdd79b99ba73 83
dkato 1:fdd79b99ba73 84 size_t EasyDec_Mov::GetNextData(void *buf, size_t len) {
dkato 1:fdd79b99ba73 85 size_t ret;
dkato 1:fdd79b99ba73 86 uint32_t rest_size = 0;
dkato 1:fdd79b99ba73 87 uint32_t aSize = *audioSizesP;
dkato 1:fdd79b99ba73 88
dkato 1:fdd79b99ba73 89 if (numOfFrames <= 0) {
dkato 1:fdd79b99ba73 90 return 0;
dkato 1:fdd79b99ba73 91 }
dkato 1:fdd79b99ba73 92
dkato 1:fdd79b99ba73 93 if (_video_flg) {
dkato 1:fdd79b99ba73 94 _video_flg = false;
dkato 1:fdd79b99ba73 95 if ((_videoBuf == NULL) || (*frameSizesP > _videoBufSize)) {
dkato 1:fdd79b99ba73 96 fseek(mov_fp, *frameSizesP, SEEK_CUR);
dkato 1:fdd79b99ba73 97 } else {
dkato 1:fdd79b99ba73 98 fread(_videoBuf, 1, *frameSizesP, mov_fp);
dkato 1:fdd79b99ba73 99 if (_function) {
dkato 1:fdd79b99ba73 100 _function();
dkato 1:fdd79b99ba73 101 }
dkato 1:fdd79b99ba73 102 }
dkato 1:fdd79b99ba73 103 frameSizesP++;
dkato 1:fdd79b99ba73 104 }
dkato 1:fdd79b99ba73 105
dkato 1:fdd79b99ba73 106 if ((int)aSize < 0) {
dkato 1:fdd79b99ba73 107 ret = 0;
dkato 1:fdd79b99ba73 108 } else {
dkato 1:fdd79b99ba73 109 if (aSize > len) {
dkato 1:fdd79b99ba73 110 rest_size = aSize - len;
dkato 1:fdd79b99ba73 111 *audioSizesP = rest_size;
dkato 1:fdd79b99ba73 112 aSize = len;
dkato 1:fdd79b99ba73 113 }
dkato 1:fdd79b99ba73 114 ret = (uint32_t)fread(buf, 1, aSize, mov_fp);
dkato 1:fdd79b99ba73 115 }
dkato 1:fdd79b99ba73 116 if (rest_size == 0) {
dkato 1:fdd79b99ba73 117 _video_flg = true;
dkato 1:fdd79b99ba73 118 audioSizesP++;
dkato 1:fdd79b99ba73 119 if (--availableCount == 0) {
dkato 1:fdd79b99ba73 120 fillCaches();
dkato 1:fdd79b99ba73 121 }
dkato 1:fdd79b99ba73 122 numOfFrames--;
dkato 1:fdd79b99ba73 123 }
dkato 1:fdd79b99ba73 124
dkato 1:fdd79b99ba73 125 return ret;
dkato 1:fdd79b99ba73 126 }
dkato 1:fdd79b99ba73 127
dkato 1:fdd79b99ba73 128 uint16_t EasyDec_Mov::GetChannel() {
dkato 1:fdd79b99ba73 129 return 2;
dkato 1:fdd79b99ba73 130 }
dkato 1:fdd79b99ba73 131
dkato 1:fdd79b99ba73 132 uint16_t EasyDec_Mov::GetBlockSize() {
dkato 1:fdd79b99ba73 133 return 16;
dkato 1:fdd79b99ba73 134 }
dkato 1:fdd79b99ba73 135
dkato 1:fdd79b99ba73 136 uint32_t EasyDec_Mov::GetSamplingRate() {
dkato 1:fdd79b99ba73 137 return 44100;
dkato 1:fdd79b99ba73 138 }
dkato 1:fdd79b99ba73 139
dkato 1:fdd79b99ba73 140 void EasyDec_Mov::search(uint32_t pattern) {
dkato 1:fdd79b99ba73 141 Buffer buf;
dkato 1:fdd79b99ba73 142 uint8_t first = pattern & 0xFF;
dkato 1:fdd79b99ba73 143 buf.value = 0;
dkato 1:fdd79b99ba73 144 while (true) {
dkato 1:fdd79b99ba73 145 size_t size = fread(buf.array, sizeof(int8_t), 1, mov_fp);
dkato 1:fdd79b99ba73 146 if (size == 0) {
dkato 1:fdd79b99ba73 147 return;
dkato 1:fdd79b99ba73 148 }
dkato 1:fdd79b99ba73 149 if (buf.array[0] == first) {
dkato 1:fdd79b99ba73 150 fread(&buf.array[1], sizeof(int8_t), 3, mov_fp);
dkato 1:fdd79b99ba73 151 if (buf.value == pattern) {
dkato 1:fdd79b99ba73 152 break;
dkato 1:fdd79b99ba73 153 }
dkato 1:fdd79b99ba73 154 }
dkato 1:fdd79b99ba73 155 }
dkato 1:fdd79b99ba73 156 }
dkato 1:fdd79b99ba73 157
dkato 1:fdd79b99ba73 158 void EasyDec_Mov::fillCaches() {
dkato 1:fdd79b99ba73 159 Buffer buf[bufSize];
dkato 1:fdd79b99ba73 160 Buffer *bufP = buf;
dkato 1:fdd79b99ba73 161 uint32_t lastFrame = lastFrameAddress;
dkato 1:fdd79b99ba73 162
dkato 1:fdd79b99ba73 163 fseek(mov_fp, stszAddress, SEEK_SET);
dkato 1:fdd79b99ba73 164 fread(frameSizes, sizeof(uint32_t), bufSize, mov_fp);
dkato 1:fdd79b99ba73 165 stszAddress += sizeof(uint32_t) * bufSize;
dkato 1:fdd79b99ba73 166
dkato 1:fdd79b99ba73 167 fseek(mov_fp, stcoAddress, SEEK_SET);
dkato 1:fdd79b99ba73 168 stcoAddress += sizeof(uint32_t) * bufSize;
dkato 1:fdd79b99ba73 169 fread(buf, sizeof(Buffer), bufSize, mov_fp);
dkato 1:fdd79b99ba73 170 availableCount = bufSize;
dkato 1:fdd79b99ba73 171 frameSizesP = frameSizes;
dkato 1:fdd79b99ba73 172 audioSizesP = audioSizes;
dkato 1:fdd79b99ba73 173 do {
dkato 1:fdd79b99ba73 174 uint32_t frameAddress = htonl(bufP->value);
dkato 1:fdd79b99ba73 175 *frameSizesP = htonl(*frameSizesP);
dkato 1:fdd79b99ba73 176 *audioSizesP++ = frameAddress - lastFrameAddress - *frameSizesP;
dkato 1:fdd79b99ba73 177 lastFrameAddress = frameAddress;
dkato 1:fdd79b99ba73 178 ++frameSizesP;
dkato 1:fdd79b99ba73 179 ++bufP;
dkato 1:fdd79b99ba73 180 } while (--availableCount);
dkato 1:fdd79b99ba73 181
dkato 1:fdd79b99ba73 182 fseek(mov_fp, lastFrame, SEEK_SET);
dkato 1:fdd79b99ba73 183 availableCount = bufSize;
dkato 1:fdd79b99ba73 184 frameSizesP = frameSizes;
dkato 1:fdd79b99ba73 185 audioSizesP = audioSizes;
dkato 1:fdd79b99ba73 186 }
dkato 1:fdd79b99ba73 187
dkato 1:fdd79b99ba73 188