/*
 * COM Classes for dmscript
 *
 * Copyright 2010 Alexandre Julliard
 *
 * 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
 */

[
    helpstring("DirectMusic Script AutoImp Segment"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpSegment.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpSegment"),
    uuid(4062c116-0270-11d3-8bcb-00600893b1b6)
]
coclass DirectMusicScriptAutoImpSegment { interface IDirectMusicScriptAutoImpSegment; }

[
    threading(both),
    progid("Microsoft.DirectMusicScriptTrack.1"),
    vi_progid("Microsoft.DirectMusicScriptTrack"),
    uuid(4108fa85-3586-11d3-8bd7-00600893b1b6)
]
coclass DirectMusicScriptTrack { interface IDirectMusicScriptTrack; }

[
    helpstring("DirectMusic Script Object"),
    threading(both),
    progid("Microsoft.DirectMusicScript.1"),
    vi_progid("Microsoft.DirectMusicScript"),
    uuid(810b5013-e88d-11d2-8bc1-00600893b1b6)
]
coclass DirectMusicScript { interface IDirectMusicScript; }

[
    helpstring("DirectMusic Script AutoImp Performance"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpPerformance.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpPerformance"),
    uuid(a861c6e2-fcfc-11d2-8bc9-00600893b1b6)
]
coclass DirectMusicScriptAutoImpPerformance { interface IDirectMusicScriptAutoImpPerformance; }

[
    helpstring("DirectMusic Script Source Code Loader"),
    threading(both),
    progid("Microsoft.DirectMusicScripSourceCodeLoader.1"), /* sic */
    vi_progid("Microsoft.DirectMusicScripSourceCodeLoader"),
    uuid(c70eb77f-efd4-4678-a27b-bf1648f30d04)
]
coclass DirectMusicScriptSourceCodeLoader { interface IDirectMusicScriptSourceCodeLoader; }

[
    helpstring("DirectMusic Script AutoImp SegmentState"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpSegmentState.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpSegmentState"),
    uuid(ebf2320a-2502-11d3-8bd1-00600893b1b6)
]
coclass DirectMusicScriptAutoImpSegmentState { interface IDirectMusicScriptAutoImpSegmentState; }

[
    helpstring("DirectMusic Script AutoImp AudioPathConfig"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpAudioPathConfig.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpAudioPathConfig"),
    uuid(1cebde3e-6b91-484a-af48-5e4f4ed6b1e1)
]
coclass DirectMusicScriptAutoImpAudioPathConfig { interface IDirectMusicScriptAutoImpAudioPathConfig; }

[
    helpstring("DirectMusic Script AutoImp AudioPath"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpAudioPath.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpAudioPath"),
    uuid(2c5f9b72-7148-4d97-bfc9-68a0e076bebd)
]
coclass DirectMusicScriptAutoImpAudioPath { interface IDirectMusicScriptAutoImpAudioPath; }

[
    helpstring("DirectMusic Script AutoImp Song"),
    threading(both),
    progid("Microsoft.DirectMusicScriptAutoImpSong.1"),
    vi_progid("Microsoft.DirectMusicScriptAutoImpSong"),
    uuid(a16f1761-b6d8-42eb-8d57-4a44fedd3bd2)
]
coclass DirectMusicScriptAutoImpSong { interface IDirectMusicScriptAutoImpSong; }

[
    helpstring("DirectMusic Audio VB Script Language"),
    threading(both),
    progid("AudioVBScript.1"),
    vi_progid("AudioVBScript"),
    uuid(4ee17959-931e-49e4-a2c6-977ecf3628f3)
]
coclass AudioVBScript { interface IAudioVBScript; }
