Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of VS1053b by
VS1053.cpp
00001 /* mbed VLSI VS1053b library 00002 * Copyright (c) 2010 Christian Schmiljun 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00020 * THE SOFTWARE. 00021 */ 00022 00023 /* This code based on: 00024 * mbeduino_MP3_Shield_MP3Player 00025 * http://mbed.org/users/xshige/programs/mbeduino_MP3_Shield_MP3Player/lgcx63 00026 * 2010-10-16 00027 */ 00028 00029 #include "VS1053.h" 00030 #include "mbed.h" 00031 00032 // patch binarys 00033 #include "Patches/VS1053b_patch_1_5.c" 00034 #include "Patches/VS1053b_patch_1_5_flac.c" 00035 #include "Patches/VS1053b_patch_1_4_flac.c" 00036 #include "Patches/VS1053b_specana_0_9.c" 00037 #include "Patches/VS1053b_pcm_recorder_0_9.c" 00038 00039 const char VS1053::_sampleRateTable[4][4] = { 00040 11, 12, 8, 0, 00041 11, 12, 8, 0, 00042 22, 24, 16, 0, 00043 44, 48, 32, 0 00044 }; 00045 00046 /* ================================================================== 00047 * Constructor 00048 * =================================================================*/ 00049 VS1053::VS1053( 00050 PinName mosi, PinName miso, PinName sck, PinName cs, PinName rst, 00051 PinName dreq, PinName dcs, char* buffer, int buffer_size) 00052 : 00053 _spi(mosi, miso, sck), 00054 _CS(cs), 00055 _RST(rst), 00056 _DCS(dcs), 00057 _DREQ(dreq), 00058 #ifdef DEBUG 00059 _led(D8), 00060 #endif 00061 #ifdef VS1053_RTOS 00062 _thread(VS1053::dataRequestHandler_start, this, osPriorityNormal, 1024) 00063 #else 00064 _DREQ_INTERUPT_IN(dreq) 00065 #endif 00066 { 00067 cs_high(); 00068 dcs_high(); 00069 00070 _volume = DEFAULT_VOLUME; 00071 _balance = DEFAULT_BALANCE_DIFERENCE_LEFT_RIGHT; 00072 _sb_amplitude = DEFAULT_BASS_AMPLITUDE; 00073 _sb_freqlimit = DEFAULT_BASS_FREQUENCY; 00074 _st_amplitude = DEFAULT_TREBLE_AMPLITUDE; 00075 _st_freqlimit = DEFAULT_TREBLE_FREQUENCY; 00076 _buffer = buffer; 00077 BUFFER_SIZE = buffer_size; 00078 #ifndef VS1053_RTOS 00079 _DREQ_INTERUPT_IN.mode(PullDown); 00080 #endif 00081 INTERRUPT_HANDLER_DISABLE; 00082 bufferReset(); 00083 00084 #ifdef VS1053_RTOS 00085 _thread.signal_set(START_THREAD); 00086 #endif 00087 } 00088 00089 00090 /*=================================================================== 00091 * Functions 00092 *==================================================================*/ 00093 00094 void VS1053::cs_low(void) { 00095 _CS = 0; 00096 } 00097 void VS1053::cs_high(void) { 00098 _CS = 1; 00099 } 00100 void VS1053::dcs_low(void) { 00101 _DCS = 0; 00102 00103 } 00104 void VS1053::dcs_high(void) { 00105 _DCS = 1; 00106 } 00107 void VS1053::sci_en(void) { //SCI enable 00108 cs_high(); 00109 dcs_high(); 00110 cs_low(); 00111 } 00112 void VS1053::sci_dis(void) { //SCI disable 00113 cs_high(); 00114 } 00115 void VS1053::sdi_en(void) { //SDI enable 00116 dcs_high(); 00117 cs_high(); 00118 dcs_low(); 00119 } 00120 void VS1053::sdi_dis(void) { //SDI disable 00121 dcs_high(); 00122 } 00123 void VS1053::reset(void) { //hardware reset 00124 INTERRUPT_HANDLER_DISABLE; 00125 wait_ms(10); 00126 _RST = 0; 00127 wait_ms(5); 00128 _RST = 1; 00129 wait_ms(10); 00130 } 00131 void VS1053::power_down(void) { //hardware and software reset 00132 cs_low(); 00133 reset(); 00134 // sci_write(0x00, SM_PDOWN); 00135 sci_write(0x00, 0x10); // tempo 00136 wait(0.01); 00137 reset(); 00138 } 00139 void VS1053::spi_initialise(void) { 00140 _RST = 1; //no reset 00141 _spi.format(8,0); //spi 8bit interface, steady state low 00142 // _spi.frequency(1000000); //rising edge data record, freq. 1Mhz 00143 _spi.frequency(2000000); //rising edge data record, freq. 2Mhz 00144 00145 00146 cs_low(); 00147 for (int i=0; i<4; i++) { 00148 _spi.write(0xFF); //clock the chip a bit 00149 } 00150 cs_high(); 00151 dcs_high(); 00152 wait_us(5); 00153 } 00154 void VS1053::sdi_initialise(void) { 00155 _spi.frequency(8000000); //set to 8 MHz to make fast transfer 00156 cs_high(); 00157 dcs_high(); 00158 } 00159 void VS1053::sci_write(unsigned char address, unsigned short int data) { 00160 // TODO disable all interrupts 00161 __disable_irq(); 00162 sci_en(); //enables SCI/disables SDI 00163 00164 while (!_DREQ); //wait unitl data request is high 00165 _spi.write(0x02); //SCI write 00166 _spi.write(address); //register address 00167 _spi.write((data >> 8) & 0xFF); //write out first half of data word 00168 _spi.write(data & 0xFF); //write out second half of data word 00169 00170 sci_dis(); //enables SDI/disables SCI 00171 wait_us(5); 00172 00173 // TODO enable all interrupts 00174 __enable_irq(); 00175 } 00176 void VS1053::sdi_write(unsigned char datum) { 00177 00178 sdi_en(); 00179 00180 while (!_DREQ); 00181 _spi.write(datum); 00182 00183 sdi_dis(); 00184 } 00185 unsigned short VS1053::sci_read(unsigned short int address) { 00186 // TODO disable all interrupts 00187 __disable_irq(); 00188 00189 cs_low(); //enables SCI/disables SDI 00190 00191 while (!_DREQ); //wait unitl data request is high 00192 _spi.write(0x03); //SCI write 00193 _spi.write(address); //register address 00194 unsigned short int received = _spi.write(0x00); //write out dummy byte 00195 received <<= 8; 00196 received |= _spi.write(0x00); //write out dummy byte 00197 00198 cs_high(); //enables SDI/disables SCI 00199 00200 // TODO enable all interrupts 00201 __enable_irq(); 00202 return received; //return received word 00203 } 00204 void VS1053::sine_test_activate(unsigned char wave) { 00205 cs_high(); //enables SDI/disables SCI 00206 00207 while (!_DREQ); //wait unitl data request is high 00208 _spi.write(0x53); //SDI write 00209 _spi.write(0xEF); //SDI write 00210 _spi.write(0x6E); //SDI write 00211 _spi.write(wave); //SDI write 00212 _spi.write(0x00); //filler byte 00213 _spi.write(0x00); //filler byte 00214 _spi.write(0x00); //filler byte 00215 _spi.write(0x00); //filler byte 00216 00217 cs_low(); //enables SCI/disables SDI 00218 } 00219 void VS1053::sine_test_deactivate(void) { 00220 cs_high(); 00221 00222 while (!_DREQ); 00223 _spi.write(0x45); //SDI write 00224 _spi.write(0x78); //SDI write 00225 _spi.write(0x69); //SDI write 00226 _spi.write(0x74); //SDI write 00227 _spi.write(0x00); //filler byte 00228 _spi.write(0x00); //filler byte 00229 _spi.write(0x00); //filler byte 00230 _spi.write(0x00); //filler byte 00231 } 00232 00233 unsigned short int VS1053::wram_read(unsigned short int address) { 00234 unsigned short int tmp1,tmp2; 00235 sci_write(SCI_WRAMADDR,address); 00236 tmp1=sci_read(SCI_WRAM); 00237 sci_write(SCI_WRAMADDR,address); 00238 tmp2=sci_read(SCI_WRAM); 00239 if (tmp1==tmp2) return tmp1; 00240 sci_write(SCI_WRAMADDR,address); 00241 tmp1=sci_read(SCI_WRAM); 00242 if (tmp1==tmp2) return tmp1; 00243 sci_write(SCI_WRAMADDR,address); 00244 tmp1=sci_read(SCI_WRAM); 00245 if (tmp1==tmp2) return tmp1; 00246 return tmp1; 00247 } 00248 00249 void VS1053::wram_write(unsigned short int address, unsigned short int data) { 00250 sci_write(SCI_WRAMADDR,address); 00251 sci_write(SCI_WRAM,data); 00252 return; 00253 } 00254 00255 void VS1053::setPlaySpeed(unsigned short speed) 00256 { 00257 wram_write(para_playSpeed, speed); 00258 DEBUGOUT("VS1053b: Change speed. New speed: %d\r\n", speed); 00259 } 00260 00261 void VS1053::terminateStream(void) { 00262 while(bufferCount() > 0) 00263 ; 00264 DEBUGOUT("VS1053b: Song terminating..\r\n"); 00265 // send at least 2052 bytes of endFillByte[7:0]. 00266 // read endFillByte (0 .. 15) from wram 00267 unsigned short endFillByte=wram_read(para_endFillByte); 00268 // clear endFillByte (8 .. 15) 00269 endFillByte = endFillByte ^0x00FF; 00270 for (int n = 0; n < 2052; n++) 00271 sdi_write(endFillByte); 00272 00273 // set SCI MODE bit SM CANCEL 00274 unsigned short sciModeByte = sci_read(SCI_MODE); 00275 sciModeByte |= SM_CANCEL; 00276 sci_write(SCI_MODE, sciModeByte); 00277 00278 // send up 2048 bytes of endFillByte[7:0]. 00279 for (int i = 0; i < 64; i++) 00280 { 00281 // send at least 32 bytes of endFillByte[7:0] 00282 for (int n = 0; n < 32; n++) 00283 sdi_write(endFillByte); 00284 // read SCI MODE; if SM CANCEL is still set, repeat 00285 sciModeByte = sci_read(SCI_MODE); 00286 if ((sciModeByte & SM_CANCEL) == 0x0000) 00287 { 00288 break; 00289 } 00290 } 00291 00292 if ((sciModeByte & SM_CANCEL) == 0x0000) 00293 { 00294 DEBUGOUT("VS1053b: Song sucessfully sent. Terminating OK\r\n"); 00295 DEBUGOUT("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL); 00296 sci_write(SCI_DECODE_TIME, 0x0000); 00297 } 00298 else 00299 { 00300 DEBUGOUT("VS1053b: SM CANCEL hasn't cleared after sending 2048 bytes, do software reset\r\n"); 00301 DEBUGOUT("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL); 00302 initialize(); 00303 } 00304 } 00305 00306 void VS1053::write_plugin(const unsigned short *plugin, unsigned int len) { 00307 unsigned int i; 00308 unsigned short addr, n, val; 00309 00310 for (i=0; i<len;) { 00311 addr = plugin[i++]; 00312 n = plugin[i++]; 00313 if (n & 0x8000U) { //RLE run, replicate n samples 00314 n &= 0x7FFF; 00315 val = plugin[i++]; 00316 while (n--) { 00317 sci_write(addr,val); 00318 } 00319 } else { //copy run, copy n sample 00320 while (n--) { 00321 val = plugin[i++]; 00322 sci_write(addr,val); 00323 } 00324 } 00325 } 00326 00327 return; 00328 } 00329 00330 00331 bool VS1053::initialize(void) { 00332 _RST = 1; 00333 cs_high(); //chip disabled 00334 spi_initialise(); //initialise MBED 00335 00336 sci_write(SCI_MODE, (SM_SDINEW+SM_RESET)); // set mode reg. 00337 wait_ms(10); 00338 00339 #ifdef DEBUG 00340 unsigned int info = wram_read(para_chipID_0); 00341 DEBUGOUT("VS1053b: ChipID_0:%04X\r\n", info); 00342 info = wram_read(para_chipID_1); 00343 DEBUGOUT("VS1053b: ChipID_1:%04X\r\n", info); 00344 info = wram_read(para_version); 00345 DEBUGOUT("VS1053b: Structure version:%04X\r\n", info); 00346 #endif 00347 00348 //get chip version, set clock multiplier and load patch 00349 int i = (sci_read(SCI_STATUS) & 0xF0) >> 4; 00350 if (i == 4) { 00351 00352 DEBUGOUT("VS1053b: Installed Chip is: VS1053\r\n"); 00353 00354 sci_write(SCI_CLOCKF, (SC_MULT_XTALIx50)); 00355 wait_ms(10); 00356 #ifdef VS_PATCH 00357 // loading patch 00358 write_plugin(vs1053b_patch, sizeof(vs1053b_patch)/2); 00359 00360 DEBUGOUT("VS1053b: Patch is loaded.\r\n"); 00361 DEBUGOUT("VS1053b: Patch size:%d bytes\r\n",sizeof(vs1053b_patch)); 00362 00363 #endif // VS_PATCH 00364 } 00365 else 00366 { 00367 DEBUGOUT("VS1053b: Not Supported Chip\r\n"); 00368 return false; 00369 } 00370 00371 // change spi to higher speed 00372 sdi_initialise(); 00373 changeVolume(); 00374 changeBass(); 00375 _isIdle = true; 00376 _isPlay = false; 00377 return true; 00378 } 00379 00380 void VS1053::setVolume(float vol) 00381 { 00382 if (vol > -0.5) 00383 _volume = -0.5; 00384 else 00385 _volume = vol; 00386 00387 changeVolume(); 00388 } 00389 00390 float VS1053::getVolume(void) 00391 { 00392 return _volume; 00393 } 00394 00395 void VS1053::setBalance(float balance) 00396 { 00397 _balance = balance; 00398 00399 changeVolume(); 00400 } 00401 00402 float VS1053::getBalance(void) 00403 { 00404 return _balance; 00405 } 00406 00407 void VS1053::changeVolume(void) 00408 { 00409 // volume calculation 00410 unsigned short volCalced = (((char)(_volume / -0.5f)) << 8) + (char)((_volume - _balance) / -0.5f); 00411 00412 sci_write(SCI_VOL, volCalced); 00413 00414 DEBUGOUT("VS1053b: Change volume to %#x (%f, Balance = %f)\r\n", volCalced, _volume, _balance); 00415 } 00416 00417 int VS1053::getTrebleFrequency(void) 00418 { 00419 return _st_freqlimit * 1000; 00420 } 00421 00422 00423 void VS1053::setTrebleFrequency(int frequency) 00424 { 00425 frequency /= 1000; 00426 00427 if(frequency < 1) 00428 { 00429 frequency = 1; 00430 } 00431 else if(frequency > 15) 00432 { 00433 frequency = 15; 00434 } 00435 _st_freqlimit = frequency; 00436 changeBass(); 00437 } 00438 00439 int VS1053::getTrebleAmplitude(void) 00440 { 00441 return _st_amplitude; 00442 } 00443 00444 void VS1053::setTrebleAmplitude(int amplitude) 00445 { 00446 if(amplitude < -8) 00447 { 00448 amplitude = -8; 00449 } 00450 else if(amplitude > 7) 00451 { 00452 amplitude = 7; 00453 } 00454 _st_amplitude = amplitude; 00455 changeBass(); 00456 } 00457 00458 int VS1053::getBassFrequency(void) 00459 { 00460 return _sb_freqlimit * 10; 00461 } 00462 00463 void VS1053::setBassFrequency(int frequency) 00464 { 00465 frequency /= 10; 00466 00467 if(frequency < 2) 00468 { 00469 frequency = 2; 00470 } 00471 else if(frequency > 15) 00472 { 00473 frequency = 15; 00474 } 00475 _sb_freqlimit = frequency; 00476 changeBass(); 00477 } 00478 00479 int VS1053::getBassAmplitude(void) 00480 { 00481 return _sb_amplitude; 00482 } 00483 00484 void VS1053::setBassAmplitude(int amplitude) 00485 { 00486 if(amplitude < -15) 00487 { 00488 amplitude = -15; 00489 } 00490 else if(amplitude > 0) 00491 { 00492 amplitude = 0; 00493 } 00494 _sb_amplitude = amplitude; 00495 changeBass(); 00496 } 00497 00498 void VS1053::changeBass(void) 00499 { 00500 unsigned short bassCalced = ((_st_amplitude & 0x0f) << 12) 00501 | ((_st_freqlimit & 0x0f) << 8) 00502 | ((_sb_amplitude & 0x0f) << 4) 00503 | ((_sb_freqlimit & 0x0f) << 0); 00504 00505 sci_write(SCI_BASS, bassCalced); 00506 00507 DEBUGOUT("VS1053b: Change bass settings to:\r\n") 00508 DEBUGOUT("VS1053b: --Treble: Amplitude=%i, Frequency=%i\r\n", getTrebleAmplitude(), getTrebleFrequency()); 00509 DEBUGOUT("VS1053b: --Bass: Amplitude=%i, Frequency=%i\r\n", getBassAmplitude(), getBassFrequency()); 00510 } 00511 00512 /*=================================================================== 00513 * Buffer handling 00514 *==================================================================*/ 00515 00516 unsigned int VS1053::bufferLength(void) 00517 { 00518 return BUFFER_SIZE; 00519 } 00520 00521 unsigned char VS1053::bufferGetByte(void) 00522 { 00523 unsigned char retVal = 0x00; 00524 if (bufferCount() > 0x00) 00525 { 00526 retVal = *_bufferReadPointer++; 00527 if (_bufferReadPointer >= _buffer + BUFFER_SIZE) 00528 { 00529 _bufferReadPointer = _buffer; 00530 } 00531 } 00532 return retVal; 00533 } 00534 00535 bool VS1053::bufferSetByte(char c) 00536 { 00537 if (bufferFree() > 0x00) 00538 { 00539 *_bufferWritePointer++ = c; 00540 if (_bufferWritePointer >= _buffer + BUFFER_SIZE) 00541 { 00542 _bufferWritePointer = _buffer; 00543 } 00544 return true; 00545 } 00546 return false; 00547 } 00548 00549 bool VS1053::bufferPutStream(const char *s, unsigned int length) 00550 { 00551 if (bufferFree() >= length) 00552 { 00553 while (length--) 00554 { 00555 *_bufferWritePointer++ = *s++; 00556 if (_bufferWritePointer >= _buffer + BUFFER_SIZE) 00557 { 00558 _bufferWritePointer = _buffer; 00559 } 00560 } 00561 return true; 00562 } 00563 return false; 00564 } 00565 00566 unsigned int VS1053::bufferFree(void) 00567 { 00568 if(_bufferReadPointer > _bufferWritePointer) 00569 { 00570 return _bufferReadPointer - _bufferWritePointer - 1; 00571 } 00572 else if(_bufferReadPointer < _bufferWritePointer) 00573 { 00574 return BUFFER_SIZE - (_bufferWritePointer - _bufferReadPointer) - 1; 00575 } 00576 return BUFFER_SIZE - 1; 00577 } 00578 00579 unsigned int VS1053::bufferCount(void) 00580 { 00581 return BUFFER_SIZE - bufferFree() - 1; 00582 } 00583 00584 void VS1053::bufferReset(void) 00585 { 00586 _bufferReadPointer = _buffer; 00587 _bufferWritePointer = _buffer; 00588 } 00589 00590 #ifdef VS1053_RTOS 00591 void VS1053::dataRequestHandler_start(const void *args) 00592 { 00593 VS1053 *instance = (VS1053*)args; 00594 instance->dataRequestHandler(); 00595 } 00596 #endif 00597 00598 void VS1053::dataRequestHandler(void) 00599 { 00600 #ifdef VS1053_RTOS 00601 _thread.signal_wait(START_THREAD); 00602 00603 while(1) 00604 { 00605 if (!_DREQ || !_isPlay) { 00606 Thread::wait(10); 00607 continue; 00608 } 00609 #else 00610 if (_isIdle && _DREQ) 00611 { 00612 #endif 00613 _isIdle = false; 00614 00615 #ifdef DEBUG 00616 _led = 0; 00617 #endif 00618 00619 // write buffer to vs1053b 00620 unsigned length = bufferCount(); 00621 int i = 0; 00622 sdi_en(); 00623 00624 while (length > 0) 00625 { 00626 int l2 = (length > 32) ? 32 : length; 00627 //DEBUGOUT("L2: %i\r\n", l2); 00628 for( ; l2 != 0; l2--) 00629 { 00630 _spi.write(bufferGetByte()); 00631 } 00632 00633 length -= l2; 00634 00635 //wait_us(50); 00636 00637 if (!_DREQ || i > 4) 00638 break; 00639 i++; 00640 } 00641 00642 sdi_dis(); 00643 00644 #ifdef DEBUG 00645 _led = 1; 00646 #endif 00647 00648 _isIdle = true; 00649 00650 #ifdef VS1053_RTOS 00651 //Thread::wait(10); 00652 Thread::yield(); 00653 #endif 00654 } 00655 } 00656 00657 void VS1053::play(void) 00658 { 00659 INTERRUPT_HANDLER_ENABLE; 00660 DEBUGOUT("VS1053b: Play.\r\n"); 00661 } 00662 00663 void VS1053::pause(void) 00664 { 00665 INTERRUPT_HANDLER_DISABLE; 00666 DEBUGOUT("VS1053b: Pause.\r\n"); 00667 #ifdef DEBUG 00668 _led = 1; 00669 #endif 00670 } 00671 00672 void VS1053::stop(void) 00673 { 00674 INTERRUPT_HANDLER_DISABLE; 00675 #ifndef VS1053_RTOS 00676 __disable_irq(); 00677 #endif 00678 DEBUGOUT("VS1053b: Song stoping..\r\n"); 00679 while(!_isIdle) 00680 ; 00681 00682 // set SCI MODE bit SM CANCEL 00683 unsigned short sciModeByte = sci_read(SCI_MODE); 00684 sciModeByte |= SM_CANCEL; 00685 sci_write(SCI_MODE, sciModeByte); 00686 00687 // send up 2048 bytes of audio data. 00688 for (int i = 0; i < 64; i++) 00689 { 00690 // send at least 32 bytes of audio data 00691 int z = bufferCount(); 00692 if (z > 32) 00693 z = 32; 00694 for (int n = 0; n < z; n++) 00695 { 00696 _spi.write(bufferGetByte()); 00697 } 00698 // read SCI MODE; if SM CANCEL is still set, repeat 00699 sciModeByte = sci_read(SCI_MODE); 00700 if ((sciModeByte & SM_CANCEL) == 0x0000) 00701 { 00702 break; 00703 } 00704 } 00705 00706 if ((sciModeByte & SM_CANCEL) == 0x0000) 00707 { 00708 // send at least 2052 bytes of endFillByte[7:0]. 00709 // read endFillByte (0 .. 15) from wram 00710 unsigned short endFillByte=wram_read(para_endFillByte); 00711 // clear endFillByte (8 .. 15) 00712 endFillByte = endFillByte ^0x00FF; 00713 for (int n = 0; n < 2052; n++) 00714 sdi_write(endFillByte); 00715 DEBUGOUT("VS1053b: Song sucessfully stopped.\r\n"); 00716 DEBUGOUT("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL); 00717 sci_write(SCI_DECODE_TIME, 0x0000); 00718 } 00719 else 00720 { 00721 DEBUGOUT("VS1053b: SM CANCEL hasn't cleared after sending 2048 bytes, do software reset\r\n"); 00722 DEBUGOUT("VS1053b: SCI MODE = %#x, SM_CANCEL = %#x\r\n", sciModeByte, sciModeByte & SM_CANCEL); 00723 initialize(); 00724 } 00725 00726 bufferReset(); 00727 #ifndef VS1053_RTOS 00728 __enable_irq(); 00729 #endif 00730 } 00731 00732 void VS1053::getAudioInfo(AudioInfo* aInfo) 00733 { 00734 // volume calculation 00735 unsigned short hdat0 = sci_read(SCI_HDAT0); 00736 unsigned short hdat1 = sci_read(SCI_HDAT1); 00737 00738 DEBUGOUT("VS1053b: Audio info\r\n"); 00739 00740 AudioInfo* retVal = aInfo; 00741 retVal->type = UNKNOWN; 00742 00743 if (hdat1 == 0x7665) 00744 { 00745 // audio is WAV 00746 retVal->type = WAV; 00747 } 00748 else if (hdat1 == 0x4154 || hdat1 == 0x4144 || hdat1 == 0x4D34 ) 00749 { 00750 // audio is AAC 00751 retVal->type = AAC; 00752 } 00753 else if (hdat1 == 0x574D ) 00754 { 00755 // audio is WMA 00756 retVal->type = WMA; 00757 } 00758 else if (hdat1 == 0x4D54 ) 00759 { 00760 // audio is MIDI 00761 retVal->type = MIDI; 00762 } 00763 else if (hdat1 == 0x4F76 ) 00764 { 00765 // audio is OGG VORBIS 00766 retVal->type = OGG_VORBIS; 00767 } 00768 else if (hdat1 >= 0xFFE0 && hdat1 <= 0xFFFF) 00769 { 00770 // audio is mp3 00771 retVal->type = MP3; 00772 00773 DEBUGOUT("VS1053b: Audio is mp3\r\n"); 00774 retVal->ext.mp3 .id = (MP3_ID)((hdat1 >> 3) & 0x0003); 00775 switch((hdat1 >> 1) & 0x0003) 00776 { 00777 case 3: 00778 retVal->ext.mp3 .layer = 1; 00779 break; 00780 case 2: 00781 retVal->ext.mp3 .layer = 2; 00782 break; 00783 case 1: 00784 retVal->ext.mp3 .layer = 3; 00785 break; 00786 default: 00787 retVal->ext.mp3 .layer = 0; 00788 break; 00789 } 00790 retVal->ext.mp3 .protrectBit = (hdat1 >> 0) & 0x0001; 00791 00792 char srate = (hdat0 >> 10) & 0x0003; 00793 retVal->ext.mp3 .kSampleRate = _sampleRateTable[retVal->ext.mp3 .id][srate]; 00794 00795 retVal->ext.mp3 .padBit = (hdat0 >> 9) & 0x0001; 00796 retVal->ext.mp3 .mode =(MP3_MODE)((hdat0 >> 6) & 0x0003); 00797 retVal->ext.mp3 .extension = (hdat0 >> 4) & 0x0003; 00798 retVal->ext.mp3 .copyright = (hdat0 >> 3) & 0x0001; 00799 retVal->ext.mp3 .original = (hdat0 >> 2) & 0x0001; 00800 retVal->ext.mp3 .emphasis = (hdat0 >> 0) & 0x0003; 00801 00802 DEBUGOUT("VS1053b: ID: %i, Layer: %i, Samplerate: %i, Mode: %i\r\n", retVal->ext.mp3 .id, retVal->ext.mp3 .layer, retVal->ext.mp3 .kSampleRate, retVal->ext.mp3 .mode); 00803 } 00804 00805 // read byteRate 00806 unsigned short byteRate = wram_read(para_byteRate); 00807 retVal->kBitRate = (byteRate * 8) / 1000; 00808 DEBUGOUT("VS1053b: BitRate: %i kBit/s\r\n", retVal->kBitRate ); 00809 00810 // decode time 00811 retVal->decodeTime = sci_read(SCI_DECODE_TIME); 00812 DEBUGOUT("VS1053b: Decodetime: %i s\r\n", retVal->decodeTime ); 00813 00814 }
Generated on Tue Jul 19 2022 01:19:15 by
1.7.2
