template <class T> void SafeDestroy(T& p) { if (p) { (*p)->Destroy(p); p = nullptr; } } SLresult _slHandleError(const char* func, int line, const char* command, SLresult r) { if (r != SL_RESULT_SUCCESS) { const char *err = nullptr; switch (r) { #define E(er) case er: err = #er; break E(SL_RESULT_PRECONDITIONS_VIOLATED); E(SL_RESULT_PARAMETER_INVALID); E(SL_RESULT_MEMORY_FAILURE); E(SL_RESULT_RESOURCE_ERROR); E(SL_RESULT_RESOURCE_LOST); E(SL_RESULT_BUFFER_INSUFFICIENT); E(SL_RESULT_CONTENT_CORRUPTED); E(SL_RESULT_CONTENT_UNSUPPORTED); #undef E default: aflog("%s(%d): err=%d %s\n", func, line, r, command); return r; } aflog("%s(%d): %s %s\n", func, line, err, command); } return r; } #define SLHandleError(command) _afHandleSLError(__FUNCTION__, __LINE__, #command, command) #define SLCall(obj,func,...) afHandleSLError((*obj)->func(obj, __VA_ARGS__))