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