NBLog.h revision c20cb50c1c14cd765874511872f087c875f43ed9
111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten/* 211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Copyright (C) 2013 The Android Open Source Project 311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * 411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * you may not use this file except in compliance with the License. 611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * You may obtain a copy of the License at 711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * 811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * 1011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Unless required by applicable law or agreed to in writing, software 1111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * See the License for the specific language governing permissions and 1411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * limitations under the License. 1511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten */ 1611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 1711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Non-blocking event logger intended for safe communication between processes via shared memory 1811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 1911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#ifndef ANDROID_MEDIA_NBLOG_H 2011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#define ANDROID_MEDIA_NBLOG_H 2111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 2211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#include <binder/IMemory.h> 2311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#include <utils/Mutex.h> 24535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten#include <audio_utils/fifo.h> 2511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 2611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastennamespace android { 2711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 284e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kastenclass String8; 294e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten 3011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass NBLog { 3111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 3211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 3311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 3411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Writer; 3511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Reader; 3611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 3711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 3811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 3911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenenum Event { 4011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten EVENT_RESERVED, 4111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten EVENT_STRING, // ASCII string, not NUL-terminated 4211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten EVENT_TIMESTAMP, // clock_gettime(CLOCK_MONOTONIC) 43fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet EVENT_INTEGER, 44fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet EVENT_FLOAT, 45fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet EVENT_PID, 46fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet EVENT_START_FMT, // logFormat start event: entry includes format string, following 47fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet // entries contain format arguments 48fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet EVENT_END_FMT, // end of logFormat argument list 4911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 5011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 5111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// --------------------------------------------------------------------------- 5211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 5311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// representation of a single log entry in private memory 5411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenstruct Entry { 5511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Entry(Event event, const void *data, size_t length) 5611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten : mEvent(event), mLength(length), mData(data) { } 5711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten /*virtual*/ ~Entry() { } 5811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 5911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten int readAt(size_t offset) const; 6011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 6111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 6211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten friend class Writer; 6311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Event mEvent; // event type 64535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten uint8_t mLength; // length of additional data, 0 <= mLength <= kMaxLength 6511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten const void *mData; // event type-specific data 66535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten static const size_t kMaxLength = 255; 67535e161e2e404dffb8389dd331be0132704b6d82Glenn Kastenpublic: 68535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten static const size_t kOverhead = 3; // mEvent, mLength, mData[...], duplicate mLength 6911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 7011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 7111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// representation of a single log entry in shared memory 7211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[0] mEvent 7311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[1] mLength 7411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[2] mData[0] 7511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ... 7611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[2+i] mData[i] 7711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ... 7811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[2+mLength-1] mData[mLength-1] 7911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[2+mLength] duplicate copy of mLength to permit reverse scan 8011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// byte[3+mLength] start of next log entry 8111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 82fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet static void appendInt(String8 *body, const void *data); 83fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet static void appendFloat(String8 *body, const void *data); 84c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet static void appendPID(String8 *body, const void *data, size_t length); 85fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet static int handleFormat(const char *fmt, size_t length, const uint8_t *data, 86fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet String8 *timestamp, String8 *body); 87fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet static void appendTimestamp(String8 *body, const void *data); 88fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet 89535e161e2e404dffb8389dd331be0132704b6d82Glenn Kastenpublic: 90535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten 91535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Located in shared memory, must be POD. 92535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Exactly one process must explicitly call the constructor or use placement new. 93535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Since this is a POD, the destructor is empty and unnecessary to call it explicitly. 9411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenstruct Shared { 95535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten Shared() /* mRear initialized via default constructor */ { } 9611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten /*virtual*/ ~Shared() { } 9711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 98535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten audio_utils_fifo_index mRear; // index one byte past the end of most recent Entry 99535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten char mBuffer[0]; // circular buffer for entries 10011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 10111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 10211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 10311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 10411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// --------------------------------------------------------------------------- 10511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 10611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// FIXME Timeline was intended to wrap Writer and Reader, but isn't actually used yet. 10711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// For now it is just a namespace for sharedSize(). 10811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Timeline : public RefBase { 10911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 11011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0 11111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Timeline(size_t size, void *shared = NULL); 11211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual ~Timeline(); 11311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif 11411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 115fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // Input parameter 'size' is the desired size of the timeline in byte units. 116fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // Returns the size rounded up to a power-of-2, plus the constant size overhead for indices. 11711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten static size_t sharedSize(size_t size); 11811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 11911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0 12011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 12111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten friend class Writer; 12211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten friend class Reader; 12311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 12411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten const size_t mSize; // circular buffer size in bytes, must be a power of 2 12511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten bool mOwn; // whether I own the memory at mShared 12611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Shared* const mShared; // pointer to shared memory 12711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif 12811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 12911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 13011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// --------------------------------------------------------------------------- 13111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 13211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Writer is thread-safe with respect to Reader, but not with respect to multiple threads 13311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// calling Writer methods. If you need multi-thread safety for writing, use LockedWriter. 13411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Writer : public RefBase { 13511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 13611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Writer(); // dummy nop implementation without shared memory 137fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten 138fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // Input parameter 'size' is the desired size of the timeline in byte units. 139fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // The size of the shared memory must be at least Timeline::sharedSize(size). 140535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten Writer(void *shared, size_t size); 141535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten Writer(const sp<IMemory>& iMemory, size_t size); 142fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten 143535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten virtual ~Writer(); 14411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 14511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void log(const char *string); 146ab7d72f0804fbb7e91ad9d2a16f826d97e20e5d0Glenn Kasten virtual void logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); 14711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void logvf(const char *fmt, va_list ap); 14811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void logTimestamp(); 149fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logTimestamp(const struct timespec &ts); 150fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logInteger(const int x); 151fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logFloat(const float x); 152fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logPID(); 153fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logFormat(const char *fmt, ...); 154fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logVFormat(const char *fmt, va_list ap); 155fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logStart(const char *fmt); 156fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logEnd(); 157fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet 15811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 15911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual bool isEnabled() const; 16011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 16111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten // return value for all of these is the previous isEnabled() 16211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual bool setEnabled(bool enabled); // but won't enable if no shared memory 16311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten bool enable() { return setEnabled(true); } 16411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten bool disable() { return setEnabled(false); } 16511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 16611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten sp<IMemory> getIMemory() const { return mIMemory; } 16711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 16811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 169535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // 0 <= length <= kMaxLength 17011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten void log(Event event, const void *data, size_t length); 17111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten void log(const Entry *entry, bool trusted = false); 17211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 17311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten Shared* const mShared; // raw pointer to shared memory 174535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten sp<IMemory> mIMemory; // ref-counted version, initialized in constructor and then const 175535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten audio_utils_fifo * const mFifo; // FIFO itself, 176535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // non-NULL unless constructor fails 177535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten audio_utils_fifo_writer * const mFifoWriter; // used to write to FIFO, 178535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // non-NULL unless dummy constructor used 17911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten bool mEnabled; // whether to actually log 180c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet 181c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet // cached pid and process name to use in %p format specifier 182c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet // total tag length is mPidTagSize and process name is not zero terminated 183c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet char *mPidTag; 184c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet size_t mPidTagSize; 18511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 18611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 18711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// --------------------------------------------------------------------------- 18811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 18911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Similar to Writer, but safe for multiple threads to call concurrently 19011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass LockedWriter : public Writer { 19111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 19211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten LockedWriter(); 193535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten LockedWriter(void *shared, size_t size); 19411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 19511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void log(const char *string); 196ab7d72f0804fbb7e91ad9d2a16f826d97e20e5d0Glenn Kasten virtual void logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); 19711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void logvf(const char *fmt, va_list ap); 19811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual void logTimestamp(); 199fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logTimestamp(const struct timespec &ts); 200fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logInteger(const int x); 201fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logFloat(const float x); 202fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logPID(); 203fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logStart(const char *fmt); 204fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet virtual void logEnd(); 20511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 20611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual bool isEnabled() const; 20711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten virtual bool setEnabled(bool enabled); 20811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 20911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 21011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten mutable Mutex mLock; 21111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 21211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 21311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// --------------------------------------------------------------------------- 21411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 21511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Reader : public RefBase { 21611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic: 217fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten 218fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // Input parameter 'size' is the desired size of the timeline in byte units. 219fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten // The size of the shared memory must be at least Timeline::sharedSize(size). 220535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten Reader(const void *shared, size_t size); 221535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten Reader(const sp<IMemory>& iMemory, size_t size); 222fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten 223535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten virtual ~Reader(); 22411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 22511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten void dump(int fd, size_t indent = 0); 22611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten bool isIMemory(const sp<IMemory>& iMemory) const; 22711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 22811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate: 229535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten /*const*/ Shared* const mShared; // raw pointer to shared memory, actually const but not 230535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // declared as const because audio_utils_fifo() constructor 231535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten sp<IMemory> mIMemory; // ref-counted version, assigned only in constructor 2324e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten int mFd; // file descriptor 2334e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten int mIndent; // indentation level 234535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten audio_utils_fifo * const mFifo; // FIFO itself, 235535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // non-NULL unless constructor fails 236535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten audio_utils_fifo_reader * const mFifoReader; // used to read from FIFO, 237535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten // non-NULL unless constructor fails 2384e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten 2394e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten void dumpLine(const String8& timestamp, String8& body); 24011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 24111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten static const size_t kSquashTimestamp = 5; // squash this many or more adjacent timestamps 24211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; 24311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 24411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}; // class NBLog 24511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 24611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten} // namespace android 24711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten 24811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif // ANDROID_MEDIA_NBLOG_H 249