2 * OpenAL cross platform audio library
3 * Copyright (C) 1999-2000 by authors.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
27 #define WIN32_LEAN_AND_MEAN
32 #include "alcontext.h"
35 ALboolean TrapALError
= AL_FALSE
;
37 void alSetError(ALCcontext
*context
, ALenum errorCode
, const char *msg
, ...)
43 int msglen
{snprintf(message
, sizeof(message
), msg
, args
)};
46 if(msglen
< 0 || (size_t)msglen
>= sizeof(message
))
48 message
[sizeof(message
)-1] = 0;
49 msglen
= (int)strlen(message
);
55 msg
= "<internal error constructing message>";
56 msglen
= (int)strlen(msg
);
59 WARN("Error generated on context %p, code 0x%04x, \"%s\"\n",
60 context
, errorCode
, message
);
64 /* DebugBreak will cause an exception if there is no debugger */
65 if(IsDebuggerPresent())
67 #elif defined(SIGTRAP)
72 ALenum curerr
{AL_NO_ERROR
};
73 context
->LastError
.compare_exchange_strong(curerr
, errorCode
);
74 if((context
->EnabledEvts
.load(std::memory_order_relaxed
)&EventType_Error
))
76 std::lock_guard
<almtx_t
> _
{context
->EventCbLock
};
77 ALbitfieldSOFT enabledevts
{context
->EnabledEvts
.load(std::memory_order_relaxed
)};
78 if((enabledevts
&EventType_Error
) && context
->EventCb
)
79 (*context
->EventCb
)(AL_EVENT_TYPE_ERROR_SOFT
, 0, errorCode
, msglen
, msg
,
84 AL_API ALenum AL_APIENTRY
alGetError(void)
86 ContextRef context
{GetContextRef()};
87 if(UNLIKELY(!context
))
89 constexpr ALenum deferror
{AL_INVALID_OPERATION
};
90 WARN("Querying error state on null context (implicitly 0x%04x)\n", deferror
);
94 if(IsDebuggerPresent())
96 #elif defined(SIGTRAP)
103 return context
->LastError
.exchange(AL_NO_ERROR
);