Output the audio signal (*.bin) with filtering by IIR filter in the SD card using onboard CODEC. For *.wav file, F746_SD_WavPlayer and F746_SD_GraphicEqualiser are published on mbed. SD カードのオーディオ信号 (*.bin) を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.*.wav 形式のファイル用には,F746_SD_WavPlayer と F746_SD_GraphicEqualiser を mbed で公開している.
Dependencies: BSP_DISCO_F746NG_patch_fixed F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed
MyClasses_Functions/sai_io_o.cpp@5:4a99dabc9180, 2016-04-17 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Apr 17 08:44:43 2016 +0000
- Revision:
- 5:4a99dabc9180
- Parent:
- 0:6748e3332e85
6
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:6748e3332e85 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:6748e3332e85 | 2 | // SiaIO class for output |
MikamiUitOpen | 0:6748e3332e85 | 3 | // 2016/02/16, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:6748e3332e85 | 4 | //----------------------------------------------------------- |
MikamiUitOpen | 0:6748e3332e85 | 5 | |
MikamiUitOpen | 0:6748e3332e85 | 6 | #include "sai_io_o.hpp" |
MikamiUitOpen | 0:6748e3332e85 | 7 | |
MikamiUitOpen | 0:6748e3332e85 | 8 | namespace Mikami |
MikamiUitOpen | 0:6748e3332e85 | 9 | { |
MikamiUitOpen | 0:6748e3332e85 | 10 | SaiIO_O::SaiIO_O(int size, int fs) : FS_(fs), tmpIndex_(0) |
MikamiUitOpen | 0:6748e3332e85 | 11 | { |
MikamiUitOpen | 0:6748e3332e85 | 12 | nData_ = size; |
MikamiUitOpen | 0:6748e3332e85 | 13 | bufferSize_ = (size*2)*2; |
MikamiUitOpen | 0:6748e3332e85 | 14 | outBuffer_ = new int16_t[(size*2)*2]; |
MikamiUitOpen | 0:6748e3332e85 | 15 | tmp_ = new int16_t[size*2]; |
MikamiUitOpen | 0:6748e3332e85 | 16 | xferred_ = false; |
MikamiUitOpen | 0:6748e3332e85 | 17 | } |
MikamiUitOpen | 5:4a99dabc9180 | 18 | SaiIO_O::~SaiIO_O() |
MikamiUitOpen | 5:4a99dabc9180 | 19 | { |
MikamiUitOpen | 5:4a99dabc9180 | 20 | delete[] tmp_; |
MikamiUitOpen | 5:4a99dabc9180 | 21 | delete[] outBuffer_; |
MikamiUitOpen | 5:4a99dabc9180 | 22 | } |
MikamiUitOpen | 0:6748e3332e85 | 23 | |
MikamiUitOpen | 0:6748e3332e85 | 24 | void SaiIO_O::InitCodecOut() |
MikamiUitOpen | 0:6748e3332e85 | 25 | { |
MikamiUitOpen | 0:6748e3332e85 | 26 | if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE, VOLUME_OUT_, FS_) == AUDIO_ERROR) |
MikamiUitOpen | 0:6748e3332e85 | 27 | ErrorTrap(); |
MikamiUitOpen | 0:6748e3332e85 | 28 | for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0; |
MikamiUitOpen | 0:6748e3332e85 | 29 | for (int n=0; n<nData_*2; n++) tmp_[n] = 0; |
MikamiUitOpen | 0:6748e3332e85 | 30 | |
MikamiUitOpen | 0:6748e3332e85 | 31 | NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ, (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler); |
MikamiUitOpen | 0:6748e3332e85 | 32 | BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02); |
MikamiUitOpen | 0:6748e3332e85 | 33 | |
MikamiUitOpen | 0:6748e3332e85 | 34 | if (BSP_AUDIO_OUT_Play((uint16_t *)outBuffer_, |
MikamiUitOpen | 0:6748e3332e85 | 35 | bufferSize_*AUDIODATA_SIZE) == AUDIO_ERROR) |
MikamiUitOpen | 0:6748e3332e85 | 36 | ErrorTrap(); |
MikamiUitOpen | 0:6748e3332e85 | 37 | } |
MikamiUitOpen | 0:6748e3332e85 | 38 | |
MikamiUitOpen | 0:6748e3332e85 | 39 | bool SaiIO_O::IsXferred() |
MikamiUitOpen | 0:6748e3332e85 | 40 | { |
MikamiUitOpen | 0:6748e3332e85 | 41 | if (xferred_) |
MikamiUitOpen | 0:6748e3332e85 | 42 | { |
MikamiUitOpen | 0:6748e3332e85 | 43 | tmpIndex_ = 0; |
MikamiUitOpen | 0:6748e3332e85 | 44 | return true; |
MikamiUitOpen | 0:6748e3332e85 | 45 | } |
MikamiUitOpen | 0:6748e3332e85 | 46 | else |
MikamiUitOpen | 0:6748e3332e85 | 47 | return false; |
MikamiUitOpen | 0:6748e3332e85 | 48 | } |
MikamiUitOpen | 0:6748e3332e85 | 49 | |
MikamiUitOpen | 0:6748e3332e85 | 50 | void SaiIO_O::Output(int16_t xL, int16_t xR) |
MikamiUitOpen | 0:6748e3332e85 | 51 | { |
MikamiUitOpen | 0:6748e3332e85 | 52 | tmp_[tmpIndex_++] = xL; // Left |
MikamiUitOpen | 0:6748e3332e85 | 53 | tmp_[tmpIndex_++] = xR; // Right |
MikamiUitOpen | 0:6748e3332e85 | 54 | } |
MikamiUitOpen | 0:6748e3332e85 | 55 | |
MikamiUitOpen | 0:6748e3332e85 | 56 | void SaiIO_O::ErrorTrap() |
MikamiUitOpen | 0:6748e3332e85 | 57 | { |
MikamiUitOpen | 0:6748e3332e85 | 58 | DigitalOut led1(LED1); |
MikamiUitOpen | 0:6748e3332e85 | 59 | fprintf(stderr, "\r\n### ERROR\r\n"); |
MikamiUitOpen | 0:6748e3332e85 | 60 | while(true) |
MikamiUitOpen | 0:6748e3332e85 | 61 | { |
MikamiUitOpen | 0:6748e3332e85 | 62 | led1 = !led1; |
MikamiUitOpen | 0:6748e3332e85 | 63 | wait_ms(250); |
MikamiUitOpen | 0:6748e3332e85 | 64 | } |
MikamiUitOpen | 0:6748e3332e85 | 65 | } |
MikamiUitOpen | 0:6748e3332e85 | 66 | |
MikamiUitOpen | 0:6748e3332e85 | 67 | void SaiIO_O::FillBuffer(uint32_t offset) |
MikamiUitOpen | 0:6748e3332e85 | 68 | { |
MikamiUitOpen | 0:6748e3332e85 | 69 | int k = offset; |
MikamiUitOpen | 0:6748e3332e85 | 70 | for (int n=0; n<nData_*2; n++) |
MikamiUitOpen | 0:6748e3332e85 | 71 | outBuffer_[k++] = tmp_[n]; |
MikamiUitOpen | 0:6748e3332e85 | 72 | xferred_ = true; |
MikamiUitOpen | 0:6748e3332e85 | 73 | } |
MikamiUitOpen | 0:6748e3332e85 | 74 | |
MikamiUitOpen | 0:6748e3332e85 | 75 | // Instances for static variables |
MikamiUitOpen | 0:6748e3332e85 | 76 | int32_t SaiIO_O::nData_; |
MikamiUitOpen | 0:6748e3332e85 | 77 | int32_t SaiIO_O::bufferSize_; |
MikamiUitOpen | 0:6748e3332e85 | 78 | int16_t* SaiIO_O::outBuffer_; |
MikamiUitOpen | 0:6748e3332e85 | 79 | int16_t* SaiIO_O::tmp_; |
MikamiUitOpen | 0:6748e3332e85 | 80 | __IO bool SaiIO_O::xferred_; |
MikamiUitOpen | 0:6748e3332e85 | 81 | } |
MikamiUitOpen | 0:6748e3332e85 | 82 | |
MikamiUitOpen | 5:4a99dabc9180 | 83 |