trace.c revision 4c37c7242b7f2f4b703bb197fd5454ea2ffe053b
1ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten/*
2ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
4ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * you may not use this file except in compliance with the License.
6ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * You may obtain a copy of the License at
7ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
8ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *
10ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * See the License for the specific language governing permissions and
14ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten * limitations under the License.
15ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten */
16ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten/* trace debugging */
18ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
197a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#if 0 // ifdef ANDROID  // FIXME requires Stagefright LOG update
207a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten//#define LOG_NDEBUG 0
217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define LOG_TAG "libOpenSLES"
227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else
237a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define LOGV printf
247a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#define LOGE printf
257a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif
26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
277a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#include "sles_allinclusive.h"
28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#ifdef USE_TRACE
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
314c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten// This should be the only global variable
324c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenstatic unsigned slTraceEnabled = SL_TRACE_DEFAULT;
334c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
344c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceSetEnabled(unsigned enabled)
35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
364c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    slTraceEnabled = enabled;
37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
394c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceEnterGlobal(const char *function)
40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
414c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if (SL_TRACE_ENTER & slTraceEnabled)
424c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten        LOGV("Entering %s\n", function);
434c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten}
444c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
454c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceLeaveGlobal(const char *function, SLresult result)
464c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten{
474c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if ((SL_RESULT_SUCCESS != result) && (SL_TRACE_LEAVE_FAILURE & slTraceEnabled)) {
485dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten        if (SLESUT_RESULT_MAX > result)
495dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten            LOGV("Leaving %s (%s)\n", function, slesutResultStrings[result]);
50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            LOGV("Leaving %s (0x%X)\n", function, (unsigned) result);
52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
554c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceEnterInterface(const char *function)
56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (*function == 'I')
58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        ++function;
59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    const char *underscore = function;
60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    while (*underscore != '\0') {
61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (*underscore == '_') {
624c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten            if ((strcmp(function, "BufferQueue_Enqueue") && strcmp(function, "BufferQueue_GetState")
634c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten                && strcmp(function, "OutputMixExt_FillBuffer")) && (SL_TRACE_ENTER & slTraceEnabled)) {
64f7f6db2450bbb7843de2d325a5b669023d9a25fdGlenn Kasten                LOGV("Entering %.*s::%s\n", (int) (underscore - function), function, &underscore[1]);
654b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten            }
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            return;
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        ++underscore;
69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
704c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if (SL_TRACE_ENTER & slTraceEnabled)
714c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten        LOGV("Entering %s\n", function);
72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
744c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceLeaveInterface(const char *function, SLresult result)
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
764c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if ((SL_RESULT_SUCCESS != result) && (SL_TRACE_LEAVE_FAILURE & slTraceEnabled)) {
77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (*function == 'I')
78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            ++function;
79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        const char *underscore = function;
80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        while (*underscore != '\0') {
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            if (*underscore == '_') {
825dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten                if (SLESUT_RESULT_MAX > result)
83f7f6db2450bbb7843de2d325a5b669023d9a25fdGlenn Kasten                    LOGE("Leaving %.*s::%s (%s)\n", (int) (underscore - function), function,
845dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten                        &underscore[1], slesutResultStrings[result]);
85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                else
86f7f6db2450bbb7843de2d325a5b669023d9a25fdGlenn Kasten                    LOGE("Leaving %.*s::%s (0x%X)\n", (int) (underscore - function), function,
87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                        &underscore[1], (unsigned) result);
88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten                return;
89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            }
90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            ++underscore;
91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        }
925dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten        if (SLESUT_RESULT_MAX > result)
935dacc932cd1084e0cd746afe0a4d7e035560113cGlenn Kasten            LOGE("Leaving %s (%s)\n", function, slesutResultStrings[result]);
94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        else
957a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten            LOGE("Leaving %s (0x%X)\n", function, (unsigned) result);
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
994c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceEnterInterfaceVoid(const char *function)
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
1014c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if (SL_TRACE_ENTER & slTraceEnabled)
1024c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten        slTraceEnterInterface(function);
103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1054c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceLeaveInterfaceVoid(const char *function)
1064c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten{
1074c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten    if (SL_TRACE_LEAVE_VOID & slTraceEnabled)
1084c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten        slTraceLeaveInterface(function, SL_RESULT_SUCCESS);
1094c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten}
1104c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
1114c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten#else
1124c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kasten
1134c37c7242b7f2f4b703bb197fd5454ea2ffe053bGlenn Kastenvoid slTraceSetEnabled(unsigned enabled)
114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten{
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten}
116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
1177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif // defined(USE_TRACE)
118