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__))