Output the audio signal with filtering by IIR filter in the *.wav file on the SD card using onboard CODEC. SD カードの *.wav ファイルのオーディオ信号を遮断周波数可変の IIR フィルタを通して,ボードに搭載されているCODEC で出力する.

Dependencies:   BSP_DISCO_F746NG F746_GUI LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed FrequencyResponseDrawer F746_SAI_IO Array_Matrix

MyClasses_Functions/FileSelectorWav.hpp

Committer:
MikamiUitOpen
Date:
2016-07-04
Revision:
11:769d986c10fa
Parent:
5:3e8ca1ed31a1

File content as of revision 11:769d986c10fa:

//--------------------------------------------------------------
//  FileSelector class ---- Header ----
//      SD カード内のファイル名の一覧を表示し,ファイルを選択する
//
//  2016/06/30, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------------

#ifndef FILE_SELECTOR_HPP
#define FILE_SELECTOR_HPP

#include "Label.hpp"
#include "ButtonGroup.hpp"
#include "SD_WavReader.hpp"
#include <algorithm>    // sort() で使用
#include <string>

namespace Mikami
{
    class FileSelector
    {
    public:
        FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
                     int maxNameLength, SD_WavReader &reader)
            : X_(x0), Y_(y0), W_H_(24), V_L_(36),
              MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength),
              BASE_COLOR_(0xFF80FFA0), TOUCHED_COLOR_(0xFF80FFFF),
              fileNames_(maxFiles),
              rect_(NULL), lcd_(GuiBase::GetLcdPtr()),
              sdReader_(reader), prevFileCount_(0), prev_(-1) {}

        ~FileSelector()
        {   delete rect_; }
        
        bool CreateTable();

        // ファイルを選択する
        bool Select(string &fileName);

        // ファイルの一覧の表示
        void DisplayFileList(bool sortEnable = true);

        // ファイルの一覧の消去
        void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
                   uint32_t color = GuiBase::ENUM_BACK);

    private:
        const uint8_t X_, Y_, W_H_, V_L_;
        const int MAX_FILES_;
        const int MAX_NAME_LENGTH_;
        const uint32_t BASE_COLOR_;
        const uint32_t TOUCHED_COLOR_;
        
        Array<string> fileNames_;
        ButtonGroup *rect_;
        Array<Label *> fileNameLabels_;
        LCD_DISCO_F746NG *lcd_;
        SD_WavReader &sdReader_;
        int fileCount_, prevFileCount_;
        int prev_;

        // Label を生成
        void CreateLabels();

        // 拡張子を削除した文字列を取得
        string GetFileNameNoExt(int n);

        // disallow copy constructor and assignment operator
        FileSelector(const FileSelector&);
        FileSelector& operator=(const FileSelector&);
    };
}
/*
namespace Mikami
{
    class FileSelector
    {
    public:
        FileSelector(uint8_t x0, uint8_t y0, int maxFiles,
                     int maxNameLength, SD_WavReader &reader)
            : X_(x0), Y_(y0), W_H_(24), V_L_(36),
              MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength),
              BASE_COLOR_(0xFF80FFA0), TOUCHED_COLOR_(0xFF80FFFF),
              fileNames_(maxFiles),
              rect_(NULL), lcd_(GuiBase::GetLcdPtr()),
              sdReader_(reader), prevFileCount_(0), prev_(-1) {}

        ~FileSelector()
        {   delete rect_; }
        
        bool CreateTable()
        {
            DIR* dp = opendir("/sd");
            fileCount_ = 0; 
            if (dp != NULL)
            {
                dirent* entry;
                for (int n=0; n<256; n++)
                {
                    entry = readdir(dp);
                    if (entry == NULL) break;

                    string strName = entry->d_name;
                    if ( (strName.find(".wav") != string::npos) ||
                         (strName.find(".WAV") != string::npos) )
                    {
                        sdReader_.Open(strName);        // ファイルオープン

                        // PCM,16 ビットステレオ,標本化周波数 44.1 kHz 以外のファイルは除外
                        if (sdReader_.IsWavFile())
                            fileNames_[fileCount_++] = strName;
                        sdReader_.Close();
                    }

                    if (fileCount_ >= MAX_FILES_) break;
                }
                closedir(dp); 
            }
            else
                return false;

            if (fileCount_ == 0) return false;

            if (rect_ != NULL) delete rect_;
            Array<string> nonString(fileCount_, "");
            rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, fileCount_,
                                    nonString, 0, V_L_-W_H_, 1,
                                    -1, Font12, 0, GuiBase::ENUM_BACK,
                                    BASE_COLOR_, TOUCHED_COLOR_);
            for (int n=0; n<fileCount_; n++) rect_->Erase(n);
            CreateLabels();   
            prevFileCount_ = fileCount_;
            return true;
        }

        // ファイルを選択する
        bool Select(string &fileName)
        {
            int n;
            if (rect_->GetTouchedNumber(n))
            {
                fileNameLabels_[n]->Draw(GetFileNameNoExt(n), TOUCHED_COLOR_);
                if ((prev_ >= 0) && (prev_ != n))
                    fileNameLabels_[prev_]->Draw(GetFileNameNoExt(prev_));
                prev_ = n;
                fileName = fileNames_[n];
                return true;
            }
            else
                return false;
        }

        // ファイルの一覧の表示
        void DisplayFileList(bool sortEnable = true)
        {
            if (sortEnable)
                std::sort((string *)fileNames_,
                          (string *)fileNames_+fileCount_); 
            
            Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_);
            rect_->DrawAll();
            for (int n=0; n<fileCount_; n++)
                fileNameLabels_[n]->Draw(GetFileNameNoExt(n));
        }

        // ファイルの一覧の消去
        void Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height,
                   uint32_t color = GuiBase::ENUM_BACK)
        {
            lcd_->SetTextColor(color);
            lcd_->FillRect(x, y, width, height);
        }

    private:
        const uint8_t X_, Y_, W_H_, V_L_;
        const int MAX_FILES_;
        const int MAX_NAME_LENGTH_;
        const uint32_t BASE_COLOR_;
        const uint32_t TOUCHED_COLOR_;
        
        Array<string> fileNames_;
        ButtonGroup *rect_;
        Array<Label *> fileNameLabels_;
        LCD_DISCO_F746NG *lcd_;
        SD_WavReader &sdReader_;
        int fileCount_, prevFileCount_;
        int prev_;

        // Label を生成
        void CreateLabels()
        {
            fileNameLabels_.SetSize(fileCount_);
                        
            for (int n=0; n<fileCount_; n++)
                fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "",
                                               Label::LEFT, Font16,
                                               BASE_COLOR_);
        }

        // 拡張子を削除した文字列を取得
        string GetFileNameNoExt(int n)
        {
            string name = fileNames_[n];
            name.erase(name.find("."));
            return name.substr(0, MAX_NAME_LENGTH_);
        }

        // disallow copy constructor and assignment operator
        FileSelector(const FileSelector&);
        FileSelector& operator=(const FileSelector&);
    };
}
*/
#endif  // FILE_SELECTOR_HPP