Home | History | Annotate | Download | only in plugins
      1 /*
      2  * Copyright 2008, The Android Open Source Project
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *  * Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  *  * Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 // must include config.h first for webkit to fiddle with new/delete
     27 #include "config.h"
     28 #include "android_npapi.h"
     29 
     30 #include "SkTypes.h"
     31 #include "media/AudioTrack.h"
     32 
     33 struct ANPAudioTrack {
     34     void*                mUser;
     35     ANPAudioCallbackProc mProc;
     36     android::AudioTrack* mTrack;
     37 };
     38 
     39 static ANPSampleFormat toANPFormat(int fm) {
     40     switch (fm) {
     41         case android::AudioSystem::PCM_16_BIT:
     42             return kPCM16Bit_ANPSampleFormat;
     43         case android::AudioSystem::PCM_8_BIT:
     44             return kPCM8Bit_ANPSampleFormat;
     45         default:
     46             return kUnknown_ANPSamleFormat;
     47     }
     48 }
     49 
     50 static int fromANPFormat(ANPSampleFormat fm) {
     51     switch (fm) {
     52         case kPCM16Bit_ANPSampleFormat:
     53             return android::AudioSystem::PCM_16_BIT;
     54         case kPCM8Bit_ANPSampleFormat:
     55             return android::AudioSystem::PCM_8_BIT;
     56         default:
     57             return android::AudioSystem::INVALID_FORMAT;
     58     }
     59 }
     60 
     61 static void callbackProc(int event, void* user, void* info) {
     62     ANPAudioTrack* track = reinterpret_cast<ANPAudioTrack*>(user);
     63 
     64     switch (event) {
     65         case android::AudioTrack::EVENT_MORE_DATA: {
     66             ANPAudioBuffer dst;
     67             android::AudioTrack::Buffer* src;
     68 
     69             src = reinterpret_cast<android::AudioTrack::Buffer*>(info);
     70             dst.bufferData      = src->raw;
     71             dst.channelCount    = src->channelCount;
     72             dst.format          = toANPFormat(src->format);
     73             dst.size            = src->size;
     74             track->mProc(kMoreData_ANPAudioEvent, track->mUser, &dst);
     75             // return the updated size field
     76             src->size = dst.size;
     77             break;
     78         }
     79         case android::AudioTrack::EVENT_UNDERRUN:
     80             track->mProc(kUnderRun_ANPAudioEvent, track->mUser, NULL);
     81             break;
     82         default:
     83             SkDebugf("------ unknown audio event for plugin %d\n", event);
     84             break;
     85     }
     86 }
     87 
     88 static ANPAudioTrack* ANPCreateTrack(uint32_t sampleRate,
     89                                      ANPSampleFormat format,
     90                                      int channelCount,
     91                                      ANPAudioCallbackProc proc,
     92                                      void* user) {
     93 
     94     ANPAudioTrack* track = new ANPAudioTrack;
     95 
     96     track->mUser = user;
     97     track->mProc = proc;
     98     track->mTrack = new android::AudioTrack(android::AudioSystem::MUSIC,
     99                                             sampleRate,
    100                                             fromANPFormat(format),
    101                                             (channelCount > 1) ? android::AudioSystem::CHANNEL_OUT_STEREO : android::AudioSystem::CHANNEL_OUT_MONO,
    102                                             0,  // frameCount
    103                                             0,  // flags
    104                                             callbackProc,
    105                                             track,
    106                                             0);
    107 
    108     if (track->mTrack->initCheck() != 0) {  // failure
    109         delete track->mTrack;
    110         delete track;
    111         track = NULL;
    112     }
    113     return track;
    114 }
    115 
    116 static void ANPDeleteTrack(ANPAudioTrack* track) {
    117     if (track) {
    118         delete track->mTrack;
    119         delete track;
    120     }
    121 }
    122 
    123 static void ANPTrackStart(ANPAudioTrack* track) {
    124     track->mTrack->start();
    125 }
    126 
    127 static void ANPTrackPause(ANPAudioTrack* track) {
    128     track->mTrack->pause();
    129 }
    130 
    131 static void ANPTrackStop(ANPAudioTrack* track) {
    132     track->mTrack->stop();
    133 }
    134 
    135 static bool ANPTrackIsStopped(ANPAudioTrack* track) {
    136     return track->mTrack->stopped();
    137 }
    138 
    139 ///////////////////////////////////////////////////////////////////////////////
    140 
    141 void ANPAudioTrackInterfaceV0_Init(ANPInterface* value) {
    142     ANPAudioTrackInterfaceV0* si = reinterpret_cast<ANPAudioTrackInterfaceV0*>(value);
    143     si->newTrack    = ANPCreateTrack;
    144     si->deleteTrack = ANPDeleteTrack;
    145     si->start       = ANPTrackStart;
    146     si->pause       = ANPTrackPause;
    147     si->stop        = ANPTrackStop;
    148     si->isStopped   = ANPTrackIsStopped;
    149 }
    150