/*
 * COM Classes for xaudio
 *
 * Copyright 2015 Guillaume Charifi
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#pragma makedep register

#if XAUDIO2_VER == 7
[
    helpstring("XAudio2 Class"),
    threading(both),
    uuid(5a508685-a254-4fba-9b82-9a24b00306af)
]
coclass XAudio27 { interface IXAudio27; }

[
    helpstring("XAudio2 Volume Meter Class"),
    threading(both),
    uuid(cac1105f-619b-4d04-831a-44e1cbf12d57)
]
coclass AudioVolumeMeter { interface IUnknown; }

[
    helpstring("XAudio2 Reverb Class"),
    threading(both),
    uuid(6a93130e-1d53-41d1-a9cf-e758800bb179)
]
coclass AudioReverb { interface IUnknown; }

[
    helpstring("XACT 31 Class"),
    threading(both),
    uuid(962f5027-99be-4692-a468-85802cf8de61)
]
coclass XACT31 { interface IUnknown; }
#endif /* XAUDIO2_VER == 7 */

#if XAUDIO2_VER == 6
[
    helpstring("XAudio2.6 Class"),
    threading(both),
    uuid(3eda9b49-2085-498b-9bb2-39a6778493de)
]
coclass XAudio26 { interface IXAudio27; }

[
    helpstring("XAudio2.6 AudioReverb Class"),
    threading(both),
    uuid(cecec95a-d894-491a-bee3-5e106fb59f2d)
]
coclass AudioReverb26 { interface IXAPO; }

[
    helpstring("XAudio2.6 AudioVolumeMeter Class"),
    threading(both),
    uuid(e48c5a3f-93ef-43bb-a092-2c7ceb946f27)
]
coclass AudioVolumeMeter26 { interface IXAPO; }
#endif /* XAUDIO2_VER == 6 */

#if XAUDIO2_VER == 5
[
    helpstring("XAudio2.5 Class"),
    threading(both),
    uuid(4c9b6dde-6809-46e6-a278-9b6a97588670)
]
coclass XAudio25 { interface IXAudio27; }

[
    helpstring("XAudio2.5 AudioReverb Class"),
    threading(both),
    uuid(d06df0d0-8518-441e-822f-5451d5c595b8)
]
coclass AudioReverb25 { interface IXAPO; }

[
    helpstring("XAudio2.5 AudioVolumeMeter Class"),
    threading(both),
    uuid(2139e6da-c341-4774-9ac3-b4e026347f64)
]
coclass AudioVolumeMeter25 { interface IXAPO; }
#endif /* XAUDIO2_VER == 5 */

#if XAUDIO2_VER == 4
[
    helpstring("XAudio2.4 Class"),
    threading(both),
    uuid(03219e78-5bc3-44d1-b92e-f63d89cc6526)
]
coclass XAudio24 { interface IXAudio27; }

[
    helpstring("XAudio2.4 AudioReverb Class"),
    threading(both),
    uuid(8bb7778b-645b-4475-9a73-1de3170bd3af)
]
coclass AudioReverb24 { interface IXAPO; }

[
    helpstring("XAudio2.4 AudioVolumeMeter Class"),
    threading(both),
    uuid(c7338b95-52b8-4542-aa79-42eb016c8c1c)
]
coclass AudioVolumeMeter24 { interface IXAPO; }
#endif /* XAUDIO2_VER == 4 */

#if XAUDIO2_VER == 3
[
    helpstring("XAudio2.3 Class"),
    threading(both),
    uuid(4c5e637a-16c7-4de3-9c46-5ed22181962d)
]
coclass XAudio23 { interface IXAudio27; }

[
    helpstring("XAudio2.3 AudioReverb Class"),
    threading(both),
    uuid(9cab402c-1d37-44b4-886d-fa4f36170a4c)
]
coclass AudioReverb23 { interface IXAPO; }

[
    helpstring("XAudio2.3 AudioVolumeMeter Class"),
    threading(both),
    uuid(e180344b-ac83-4483-959e-18a5c56a5e19)
]
coclass AudioVolumeMeter23 { interface IXAPO; }
#endif /* XAUDIO2_VER == 3 */

#if XAUDIO2_VER == 2
[
    helpstring("XAudio2.2 Class"),
    threading(both),
    uuid(b802058a-464a-42db-bc10-b650d6f2586a)
]
coclass XAudio22 { interface IXAudio22; }

[
    helpstring("XAudio2.2 AudioReverb Class"),
    threading(both),
    uuid(629cf0de-3ecc-41e7-9926-f7e43eebec51)
]
coclass AudioReverb22 { interface IXAPO; }

[
    helpstring("XAudio2.2 AudioVolumeMeter Class"),
    threading(both),
    uuid(f5ca7b34-8055-42c0-b836-216129eb7e30)
]
coclass AudioVolumeMeter22 { interface IXAPO; }
#endif /* XAUDIO2_VER == 2 */

#if XAUDIO2_VER == 1
[
    helpstring("XAudio2.1 Class"),
    threading(both),
    uuid(e21a7345-eb21-468e-be50-804db97cf708)
]
coclass XAudio21 { interface IXAudio22; }

[
    helpstring("XAudio2.1 AudioReverb Class"),
    threading(both),
    uuid(f4769300-b949-4df9-b333-00d33932e9a6)
]
coclass AudioReverb21 { interface IXAPO; }

[
    helpstring("XAudio2.1 AudioVolumeMeter Class"),
    threading(both),
    uuid(c1e3f122-a2ea-442c-854f-20d98f8357a1)
]
coclass AudioVolumeMeter21 { interface IXAPO; }
#endif /* XAUDIO2_VER == 1 */

#if XAUDIO2_VER == 0
[
    helpstring("XAudio2.0 Class"),
    threading(both),
    uuid(fac23f48-31f5-45a8-b49b-5225d61401aa)
]
coclass XAudio20 { interface IXAudio20; }

[
    helpstring("XAudio2.0 AudioReverb Class"),
    threading(both),
    uuid(6f6ea3a9-2cf5-41cf-91c1-2170b1540063)
]
coclass AudioReverb20 { interface IXAPO; }

[
    helpstring("XAudio2.0 AudioVolumeMeter Class"),
    threading(both),
    uuid(c0c56f46-29b1-44e9-9939-a32ce86867e2)
]
coclass AudioVolumeMeter20 { interface IXAPO; }
#endif /* XAUDIO2_VER == 0 */
