Easy playback library for PwmOutSpeaker.

EasyPlaybackPWM.cpp

Committer:
dkato
Date:
2017-07-06
Revision:
0:41ab76b22961

File content as of revision 0:41ab76b22961:

/* mbed EasyPlaybackPWM Library
 * Copyright (C) 2017 dkato
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "mbed.h"
#include "EasyPlaybackPWM.h"

EasyPlaybackPWM::EasyPlaybackPWM(PinName pwm_l, PinName pwm_r) : audio(pwm_l, pwm_r), _skip(false), _pause(false)
{
    _audio_buf = new uint8_t[AUDIO_WRITE_BUFF_SIZE];
}

EasyPlaybackPWM::~EasyPlaybackPWM()
{
    delete [] _audio_buf;
}

bool EasyPlaybackPWM::get_tag(const char* filename, char* p_title, char* p_artist, char* p_album, uint16_t tag_size)
{
    FILE * fp;
    EasyDecoder * decoder;
    bool ret = false;

    decoder = create_decoer_class(filename);
    if (decoder == NULL) {
        return false;
    }

    fp = fopen(filename, "r");
    if (decoder->AnalyzeHeder(p_title, p_artist, p_album, tag_size, fp) != false) {
        ret = true;
    }
    delete decoder;
    fclose(fp);

    return ret;
}

bool EasyPlaybackPWM::play(const char* filename)
{
    size_t audio_data_size = AUDIO_WRITE_BUFF_SIZE;
    FILE * fp;
    EasyDecoder * decoder;
    bool ret = false;

    decoder = create_decoer_class(filename);
    if (decoder == NULL) {
        return false;
    }

     _skip = false;
    fp = fopen(filename, "r");
    if (decoder->AnalyzeHeder(NULL, NULL, NULL, 0, fp) == false) {
        // do nothing
    } else if  ((decoder->GetChannel() != 2)
            || (audio.format(decoder->GetBlockSize()) == false)
            || (audio.frequency(decoder->GetSamplingRate()) == false)) {
        // do nothing
    } else {
        while (audio_data_size == AUDIO_WRITE_BUFF_SIZE) {
            while ((_pause) && (!_skip)) {
                Thread::wait(100);
            }
            if (_skip) {
                break;
            }
            audio_data_size = decoder->GetNextData(_audio_buf, AUDIO_WRITE_BUFF_SIZE);
            if (audio_data_size > 0) {
                audio.write(_audio_buf, audio_data_size);
            }
        }
        Thread::wait(500);
        ret = true;
    }
    delete decoder;
    fclose(fp);

    return ret;
}

bool EasyPlaybackPWM::is_paused(void)
{
    return _pause;
}

void EasyPlaybackPWM::pause()
{
    _pause = !_pause;
}

void EasyPlaybackPWM::pause(bool type)
{
    _pause = type;
}

void EasyPlaybackPWM::skip(void)
{
    _skip = true;
}

bool EasyPlaybackPWM::outputVolume(float VolumeOut)
{
    return audio.outputVolume(VolumeOut);
}

EasyDecoder * EasyPlaybackPWM::create_decoer_class(const char* filename)
{
    std::map<std::string, EasyDecoder*(*)()>::iterator itr;
    char *extension = strstr((char*)filename, ".");

    if (extension == NULL) {
        return NULL;
    }

    itr = m_lpDecoders.find(extension);
    if (itr == m_lpDecoders.end()) {
        return NULL;
    }

    return (*itr).second();
}