Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
f74cbdf7
Commit
f74cbdf7
authored
Dec 27, 2009
by
Jean-Baptiste Kempf
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DirectX/Waveout: new windows_audio_common.h file
So we stop duplicating the code if we try to improve it later on :D
parent
9ae49e3b
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
155 additions
and
207 deletions
+155
-207
modules/audio_output/Modules.am
modules/audio_output/Modules.am
+2
-2
modules/audio_output/directx.c
modules/audio_output/directx.c
+3
-118
modules/audio_output/waveout.c
modules/audio_output/waveout.c
+1
-87
modules/audio_output/windows_audio_common.h
modules/audio_output/windows_audio_common.h
+149
-0
No files found.
modules/audio_output/Modules.am
View file @
f74cbdf7
SOURCES_alsa = alsa.c
SOURCES_aout_directx = directx.c
SOURCES_aout_directx = directx.c
windows_audio_common.h
SOURCES_aout_file = file.c
SOURCES_oss = oss.c
SOURCES_aout_sdl = sdl.c
SOURCES_waveout = waveout.c
SOURCES_waveout = waveout.c
windows_audio_common.h
SOURCES_hd1000a = hd1000a.cpp
SOURCES_portaudio = portaudio.c
SOURCES_auhal = auhal.c
...
...
modules/audio_output/directx.c
View file @
f74cbdf7
...
...
@@ -34,106 +34,11 @@
#include <vlc_aout.h>
#include <vlc_charset.h>
#include
<windows.h>
#include <mmsystem.h>
#include
"windows_audio_common.h"
#include <dsound.h>
#define FRAME_SIZE ((int)p_aout->output.output.i_rate/20)
/* Size in samples */
#define FRAMES_NUM 8
/* Needs to be > 3 */
/*****************************************************************************
* DirectSound GUIDs.
* Defining them here allows us to get rid of the dxguid library during
* the linking stage.
*****************************************************************************/
#include <initguid.h>
/*****************************************************************************
* Useful macros
*****************************************************************************/
#ifndef WAVE_FORMAT_IEEE_FLOAT
# define WAVE_FORMAT_IEEE_FLOAT 0x0003
#endif
#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
# define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
#endif
#ifndef WAVE_FORMAT_EXTENSIBLE
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE
#endif
#ifndef SPEAKER_FRONT_LEFT
# define SPEAKER_FRONT_LEFT 0x1
# define SPEAKER_FRONT_RIGHT 0x2
# define SPEAKER_FRONT_CENTER 0x4
# define SPEAKER_LOW_FREQUENCY 0x8
# define SPEAKER_BACK_LEFT 0x10
# define SPEAKER_BACK_RIGHT 0x20
# define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
# define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
# define SPEAKER_BACK_CENTER 0x100
# define SPEAKER_SIDE_LEFT 0x200
# define SPEAKER_SIDE_RIGHT 0x400
# define SPEAKER_TOP_CENTER 0x800
# define SPEAKER_TOP_FRONT_LEFT 0x1000
# define SPEAKER_TOP_FRONT_CENTER 0x2000
# define SPEAKER_TOP_FRONT_RIGHT 0x4000
# define SPEAKER_TOP_BACK_LEFT 0x8000
# define SPEAKER_TOP_BACK_CENTER 0x10000
# define SPEAKER_TOP_BACK_RIGHT 0x20000
# define SPEAKER_RESERVED 0x80000000
#endif
#ifndef DSSPEAKER_DSSPEAKER_DIRECTOUT
# define DSSPEAKER_DSSPEAKER_DIRECTOUT 0x00000000
#endif
#ifndef DSSPEAKER_HEADPHONE
# define DSSPEAKER_HEADPHONE 0x00000001
#endif
#ifndef DSSPEAKER_MONO
# define DSSPEAKER_MONO 0x00000002
#endif
#ifndef DSSPEAKER_QUAD
# define DSSPEAKER_QUAD 0x00000003
#endif
#ifndef DSSPEAKER_STEREO
# define DSSPEAKER_STEREO 0x00000004
#endif
#ifndef DSSPEAKER_SURROUND
# define DSSPEAKER_SURROUND 0x00000005
#endif
#ifndef DSSPEAKER_5POINT1
# define DSSPEAKER_5POINT1 0x00000006
#endif
#ifndef DSSPEAKER_7POINT1
# define DSSPEAKER_7POINT1 0x00000007
#endif
#ifndef DSSPEAKER_7POINT1_SURROUND
# define DSSPEAKER_7POINT1_SURROUND 0x00000008
#endif
#ifndef DSSPEAKER_7POINT1_WIDE
# define DSSPEAKER_7POINT1_WIDE DSSPEAKER_7POINT1
#endif
#ifndef _WAVEFORMATEXTENSIBLE_
typedef
struct
{
WAVEFORMATEX
Format
;
union
{
WORD
wValidBitsPerSample
;
/* bits of precision */
WORD
wSamplesPerBlock
;
/* valid if wBitsPerSample==0 */
WORD
wReserved
;
/* If neither applies, set to zero. */
}
Samples
;
DWORD
dwChannelMask
;
/* which channels are */
/* present in stream */
GUID
SubFormat
;
}
WAVEFORMATEXTENSIBLE
,
*
PWAVEFORMATEXTENSIBLE
;
#endif
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
,
WAVE_FORMAT_IEEE_FLOAT
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_PCM
,
WAVE_FORMAT_PCM
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF
,
WAVE_FORMAT_DOLBY_AC3_SPDIF
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
/*****************************************************************************
* notification_thread_t: DirectX event thread
...
...
@@ -184,23 +89,6 @@ struct aout_sys_t
uint32_t
i_channels
;
};
static
const
uint32_t
pi_channels_src
[]
=
{
AOUT_CHAN_LEFT
,
AOUT_CHAN_RIGHT
,
AOUT_CHAN_MIDDLELEFT
,
AOUT_CHAN_MIDDLERIGHT
,
AOUT_CHAN_REARLEFT
,
AOUT_CHAN_REARRIGHT
,
AOUT_CHAN_REARCENTER
,
AOUT_CHAN_CENTER
,
AOUT_CHAN_LFE
,
0
};
static
const
uint32_t
pi_channels_in
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
0
};
static
const
uint32_t
pi_channels_out
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
0
};
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
...
...
@@ -231,10 +119,7 @@ static const char *const ppsz_adev_text[] = {"default", };
*****************************************************************************/
#define DEVICE_TEXT N_("Output device")
#define DEVICE_LONGTEXT N_("Select your audio output device")
#define FLOAT_TEXT N_("Use float32 output")
#define FLOAT_LONGTEXT N_( \
"The option allows you to enable or disable the high-quality float32 " \
"audio output mode (which is not well supported by some soundcards)." )
#define SPEAKER_TEXT N_("Speaker configuration")
#define SPEAKER_LONGTEXT N_("Select speaker configuration you want to use. " \
"This option doesn't upmix! So NO e.g. Stereo -> 5.1 conversion." )
...
...
modules/audio_output/waveout.c
View file @
f74cbdf7
...
...
@@ -35,74 +35,9 @@
#include <vlc_aout.h>
#include <vlc_charset.h>
#include <windows.h>
#include <mmsystem.h>
#include "windows_audio_common.h"
#define FRAME_SIZE 4096
/* The size is in samples, not in bytes */
#define FRAMES_NUM 8
/*****************************************************************************
* Useful macros
*****************************************************************************/
#ifdef UNDER_CE
# define DWORD_PTR DWORD
# ifdef waveOutGetDevCaps
# undef waveOutGetDevCaps
MMRESULT
WINAPI
waveOutGetDevCaps
(
UINT
,
LPWAVEOUTCAPS
,
UINT
);
# endif
#endif
#ifndef WAVE_FORMAT_IEEE_FLOAT
# define WAVE_FORMAT_IEEE_FLOAT 0x0003
#endif
#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
# define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
#endif
#ifndef WAVE_FORMAT_EXTENSIBLE
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE
#endif
#ifndef SPEAKER_FRONT_LEFT
# define SPEAKER_FRONT_LEFT 0x1
# define SPEAKER_FRONT_RIGHT 0x2
# define SPEAKER_FRONT_CENTER 0x4
# define SPEAKER_LOW_FREQUENCY 0x8
# define SPEAKER_BACK_LEFT 0x10
# define SPEAKER_BACK_RIGHT 0x20
# define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
# define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
# define SPEAKER_BACK_CENTER 0x100
# define SPEAKER_SIDE_LEFT 0x200
# define SPEAKER_SIDE_RIGHT 0x400
# define SPEAKER_TOP_CENTER 0x800
# define SPEAKER_TOP_FRONT_LEFT 0x1000
# define SPEAKER_TOP_FRONT_CENTER 0x2000
# define SPEAKER_TOP_FRONT_RIGHT 0x4000
# define SPEAKER_TOP_BACK_LEFT 0x8000
# define SPEAKER_TOP_BACK_CENTER 0x10000
# define SPEAKER_TOP_BACK_RIGHT 0x20000
# define SPEAKER_RESERVED 0x80000000
#endif
#ifndef _WAVEFORMATEXTENSIBLE_
typedef
struct
{
WAVEFORMATEX
Format
;
union
{
WORD
wValidBitsPerSample
;
/* bits of precision */
WORD
wSamplesPerBlock
;
/* valid if wBitsPerSample==0 */
WORD
wReserved
;
/* If neither applies, set to zero. */
}
Samples
;
DWORD
dwChannelMask
;
/* which channels are */
/* present in stream */
GUID
SubFormat
;
}
WAVEFORMATEXTENSIBLE
,
*
PWAVEFORMATEXTENSIBLE
;
#endif
static
const
GUID
__KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
=
{
WAVE_FORMAT_IEEE_FLOAT
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
static
const
GUID
__KSDATAFORMAT_SUBTYPE_PCM
=
{
WAVE_FORMAT_PCM
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
static
const
GUID
__KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF
=
{
WAVE_FORMAT_DOLBY_AC3_SPDIF
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
/*****************************************************************************
* Local prototypes
...
...
@@ -152,10 +87,6 @@ static const char *const ppsz_adev_text[] = { N_("Microsoft Soundmapper") };
/*****************************************************************************
* Module descriptor
*****************************************************************************/
#define FLOAT_TEXT N_("Use float32 output")
#define FLOAT_LONGTEXT N_( \
"The option allows you to enable or disable the high-quality float32 " \
"audio output mode (which is not well supported by some soundcards)." )
#define DEVICE_TEXT N_("Select Audio Device")
#define DEVICE_LONG N_("Select special Audio device, or let windows "\
"decide (default), change needs VLC restart "\
...
...
@@ -215,23 +146,6 @@ struct aout_sys_t
int
pi_chan_table
[
AOUT_CHAN_MAX
];
};
static
const
uint32_t
pi_channels_src
[]
=
{
AOUT_CHAN_LEFT
,
AOUT_CHAN_RIGHT
,
AOUT_CHAN_MIDDLELEFT
,
AOUT_CHAN_MIDDLERIGHT
,
AOUT_CHAN_REARLEFT
,
AOUT_CHAN_REARRIGHT
,
AOUT_CHAN_REARCENTER
,
AOUT_CHAN_CENTER
,
AOUT_CHAN_LFE
,
0
};
static
const
uint32_t
pi_channels_in
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
0
};
static
const
uint32_t
pi_channels_out
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
0
};
/*****************************************************************************
* Open: open the audio device
*****************************************************************************
...
...
modules/audio_output/windows_audio_common.h
0 → 100644
View file @
f74cbdf7
/*****************************************************************************
* windows_common.h: Windows Audio common code
*****************************************************************************
* Copyright (C) 2001-2009 VideoLAN
* $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
* Jean-Baptiste Kempf <jb@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include <windows.h>
#include <mmsystem.h>
/*****************************************************************************
* DirectSound GUIDs.
* Defining them here allows us to get rid of the dxguid library during
* the linking stage.
*****************************************************************************/
#define INITGUID
/* Doesn't define the DEFINE_GUID as extern */
#include <initguid.h>
#ifndef WAVE_FORMAT_IEEE_FLOAT
# define WAVE_FORMAT_IEEE_FLOAT 0x0003
#endif
#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
# define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
#endif
#ifndef WAVE_FORMAT_EXTENSIBLE
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE
#endif
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
,
WAVE_FORMAT_IEEE_FLOAT
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_PCM
,
WAVE_FORMAT_PCM
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
DEFINE_GUID
(
_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF
,
WAVE_FORMAT_DOLBY_AC3_SPDIF
,
0x0000
,
0x0010
,
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
);
static
const
GUID
__KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
=
{
WAVE_FORMAT_IEEE_FLOAT
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
static
const
GUID
__KSDATAFORMAT_SUBTYPE_PCM
=
{
WAVE_FORMAT_PCM
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
static
const
GUID
__KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF
=
{
WAVE_FORMAT_DOLBY_AC3_SPDIF
,
0x0000
,
0x0010
,
{
0x80
,
0x00
,
0x00
,
0xaa
,
0x00
,
0x38
,
0x9b
,
0x71
}};
#define FRAMES_NUM 8
/* Needs to be > 3 */
#ifndef _WAVEFORMATEXTENSIBLE_
typedef
struct
{
WAVEFORMATEX
Format
;
union
{
WORD
wValidBitsPerSample
;
/* bits of precision */
WORD
wSamplesPerBlock
;
/* valid if wBitsPerSample==0 */
WORD
wReserved
;
/* If neither applies, set to zero. */
}
Samples
;
DWORD
dwChannelMask
;
/* which channels are */
/* present in stream */
GUID
SubFormat
;
}
WAVEFORMATEXTENSIBLE
,
*
PWAVEFORMATEXTENSIBLE
;
#endif
#ifndef SPEAKER_FRONT_LEFT
# define SPEAKER_FRONT_LEFT 0x1
# define SPEAKER_FRONT_RIGHT 0x2
# define SPEAKER_FRONT_CENTER 0x4
# define SPEAKER_LOW_FREQUENCY 0x8
# define SPEAKER_BACK_LEFT 0x10
# define SPEAKER_BACK_RIGHT 0x20
# define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
# define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
# define SPEAKER_BACK_CENTER 0x100
# define SPEAKER_SIDE_LEFT 0x200
# define SPEAKER_SIDE_RIGHT 0x400
# define SPEAKER_TOP_CENTER 0x800
# define SPEAKER_TOP_FRONT_LEFT 0x1000
# define SPEAKER_TOP_FRONT_CENTER 0x2000
# define SPEAKER_TOP_FRONT_RIGHT 0x4000
# define SPEAKER_TOP_BACK_LEFT 0x8000
# define SPEAKER_TOP_BACK_CENTER 0x10000
# define SPEAKER_TOP_BACK_RIGHT 0x20000
# define SPEAKER_RESERVED 0x80000000
#endif
#ifndef DSSPEAKER_DSSPEAKER_DIRECTOUT
# define DSSPEAKER_DSSPEAKER_DIRECTOUT 0x00000000
#endif
#ifndef DSSPEAKER_HEADPHONE
# define DSSPEAKER_HEADPHONE 0x00000001
#endif
#ifndef DSSPEAKER_MONO
# define DSSPEAKER_MONO 0x00000002
#endif
#ifndef DSSPEAKER_QUAD
# define DSSPEAKER_QUAD 0x00000003
#endif
#ifndef DSSPEAKER_STEREO
# define DSSPEAKER_STEREO 0x00000004
#endif
#ifndef DSSPEAKER_SURROUND
# define DSSPEAKER_SURROUND 0x00000005
#endif
#ifndef DSSPEAKER_5POINT1
# define DSSPEAKER_5POINT1 0x00000006
#endif
#ifndef DSSPEAKER_7POINT1
# define DSSPEAKER_7POINT1 0x00000007
#endif
#ifndef DSSPEAKER_7POINT1_SURROUND
# define DSSPEAKER_7POINT1_SURROUND 0x00000008
#endif
#ifndef DSSPEAKER_7POINT1_WIDE
# define DSSPEAKER_7POINT1_WIDE DSSPEAKER_7POINT1
#endif
static
const
uint32_t
pi_channels_src
[]
=
{
AOUT_CHAN_LEFT
,
AOUT_CHAN_RIGHT
,
AOUT_CHAN_MIDDLELEFT
,
AOUT_CHAN_MIDDLERIGHT
,
AOUT_CHAN_REARLEFT
,
AOUT_CHAN_REARRIGHT
,
AOUT_CHAN_REARCENTER
,
AOUT_CHAN_CENTER
,
AOUT_CHAN_LFE
,
0
};
static
const
uint32_t
pi_channels_in
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
0
};
static
const
uint32_t
pi_channels_out
[]
=
{
SPEAKER_FRONT_LEFT
,
SPEAKER_FRONT_RIGHT
,
SPEAKER_FRONT_CENTER
,
SPEAKER_LOW_FREQUENCY
,
SPEAKER_BACK_LEFT
,
SPEAKER_BACK_RIGHT
,
SPEAKER_BACK_CENTER
,
SPEAKER_SIDE_LEFT
,
SPEAKER_SIDE_RIGHT
,
0
};
#define FLOAT_TEXT N_("Use float32 output")
#define FLOAT_LONGTEXT N_( \
"The option allows you to enable or disable the high-quality float32 " \
"audio output mode (which is not well supported by some soundcards)." )
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment