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
35 ALboolean TrapALError
= AL_FALSE
;
37 void alSetError(ALCcontext
*context
, ALenum errorCode
, const char *msg
, ...)
39 ALenum curerr
= AL_NO_ERROR
;
40 char message
[1024] = { 0 };
45 msglen
= vsnprintf(message
, sizeof(message
), msg
, args
);
48 if(msglen
< 0 || (size_t)msglen
>= sizeof(message
))
50 message
[sizeof(message
)-1] = 0;
51 msglen
= (int)strlen(message
);
57 msg
= "<internal error constructing message>";
58 msglen
= (int)strlen(msg
);
61 WARN("Error generated on context %p, code 0x%04x, \"%s\"\n",
62 context
, errorCode
, message
);
66 /* DebugBreak will cause an exception if there is no debugger */
67 if(IsDebuggerPresent())
69 #elif defined(SIGTRAP)
74 ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&context
->LastError
, &curerr
, errorCode
);
75 if((ATOMIC_LOAD(&context
->EnabledEvts
, almemory_order_relaxed
)&EventType_Error
))
77 ALbitfieldSOFT enabledevts
;
78 almtx_lock(&context
->EventCbLock
);
79 enabledevts
= ATOMIC_LOAD(&context
->EnabledEvts
, almemory_order_relaxed
);
80 if((enabledevts
&EventType_Error
) && context
->EventCb
)
81 (*context
->EventCb
)(AL_EVENT_TYPE_ERROR_SOFT
, 0, errorCode
, msglen
, msg
,
83 almtx_unlock(&context
->EventCbLock
);
87 AL_API ALenum AL_APIENTRY
alGetError(void)
92 context
= GetContextRef();
95 const ALenum deferror
= AL_INVALID_OPERATION
;
96 WARN("Querying error state on null context (implicitly 0x%04x)\n", deferror
);
100 if(IsDebuggerPresent())
102 #elif defined(SIGTRAP)
109 errorCode
= ATOMIC_EXCHANGE_SEQ(&context
->LastError
, AL_NO_ERROR
);
111 ALCcontext_DecRef(context
);