SineSource.cpp revision c297fccffc4ab1cb3b9f5c6a5b0802be057f3e0f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SineSource.h" 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h> 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/MediaBufferGroup.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/MediaDebug.h> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/MediaDefs.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/MetaData.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SineSource::SineSource(int32_t sampleRate, int32_t numChannels) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : mStarted(false), 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mSampleRate(sampleRate), 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mNumChannels(numChannels), 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPhase(0), 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGroup(NULL) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(numChannels == 1 || numChannels == 2); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SineSource::~SineSource() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mStarted) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stop(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)status_t SineSource::start(MetaData *params) { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(!mStarted); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGroup = new MediaBufferGroup; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mGroup->add_buffer(new MediaBuffer(kBufferSize)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPhase = 0; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mStarted = true; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)status_t SineSource::stop() { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(mStarted); 41 42 delete mGroup; 43 mGroup = NULL; 44 45 mStarted = false; 46 47 return OK; 48} 49 50sp<MetaData> SineSource::getFormat() { 51 sp<MetaData> meta = new MetaData; 52 meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); 53 meta->setInt32(kKeyChannelCount, mNumChannels); 54 meta->setInt32(kKeySampleRate, mSampleRate); 55 meta->setInt32(kKeyMaxInputSize, kBufferSize); 56 57 return meta; 58} 59 60status_t SineSource::read( 61 MediaBuffer **out, const ReadOptions *options) { 62 *out = NULL; 63 64 MediaBuffer *buffer; 65 status_t err = mGroup->acquire_buffer(&buffer); 66 67 if (err != OK) { 68 return err; 69 } 70 71 size_t frameSize = mNumChannels * sizeof(int16_t); 72 size_t numFramesPerBuffer = buffer->size() / frameSize; 73 74 int16_t *ptr = (int16_t *)buffer->data(); 75 76 const double k = kFrequency / mSampleRate * (2.0 * M_PI); 77 78 double x = mPhase * k; 79 for (size_t i = 0; i < numFramesPerBuffer; ++i) { 80 int16_t amplitude = (int16_t)(32767.0 * sin(x)); 81 82 *ptr++ = amplitude; 83 if (mNumChannels == 2) { 84 *ptr++ = amplitude; 85 } 86 87 x += k; 88 } 89 90 buffer->meta_data()->setInt64( 91 kKeyTime, ((int64_t)mPhase * 1000000) / mSampleRate); 92 93 mPhase += numFramesPerBuffer; 94 95 buffer->set_range(0, numFramesPerBuffer * frameSize); 96 97 *out = buffer; 98 99 return OK; 100} 101 102} // namespace android 103