Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
7cae201e
Commit
7cae201e
authored
Aug 01, 2002
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Authors: Eric Pouech <eric.pouech@wanadoo.fr>, Michael Stefaniuc <mstefani@redhat.com>
Convert HMIDI, HMIDIIN, HMIDIOUT, HMIDISTRM to void*.
parent
c754a89b
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
52 additions
and
43 deletions
+52
-43
lolvldrv.c
dlls/winmm/lolvldrv.c
+1
-1
mcimidi.c
dlls/winmm/mciseq/mcimidi.c
+10
-12
midimap.c
dlls/winmm/midimap/midimap.c
+2
-4
mmsystem.c
dlls/winmm/mmsystem.c
+24
-22
winemm.h
dlls/winmm/winemm.h
+11
-0
mmsystem.h
include/mmsystem.h
+4
-4
No files found.
dlls/winmm/lolvldrv.c
View file @
7cae201e
...
...
@@ -693,7 +693,7 @@ static MMDRV_MapType MMDRV_MidiOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPD
*
(
LPDWORD
)((
char
*
)
ptr
+
sizeof
(
LPMIDIOPENDESC
))
=
*
lpdwUser
;
mod16
=
(
LPMIDIOPENDESC16
)((
LPSTR
)
ptr
+
sizeof
(
LPMIDIOPENDESC
)
+
2
*
sizeof
(
DWORD
));
mod16
->
hMidi
=
mod32
->
hMidi
;
mod16
->
hMidi
=
HMIDI_16
(
mod32
->
hMidi
)
;
mod16
->
dwCallback
=
mod32
->
dwCallback
;
mod16
->
dwInstance
=
mod32
->
dwInstance
;
mod16
->
dnDevNode
=
mod32
->
dnDevNode
;
...
...
dlls/winmm/mciseq/mcimidi.c
View file @
7cae201e
...
...
@@ -817,7 +817,7 @@ static DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm
wmm
->
dwStatus
=
MCI_MODE_NOT_READY
;
if
(
oldstat
==
MCI_MODE_PAUSE
)
dwRet
=
midiOutReset
(
wmm
->
hMidi
);
dwRet
=
midiOutReset
(
(
HMIDIOUT
)
wmm
->
hMidi
);
while
(
wmm
->
dwStatus
!=
MCI_MODE_STOP
)
Sleep
(
10
);
...
...
@@ -962,7 +962,7 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
MIDI_mciReadNextEvent
(
wmm
,
mmt
);
/* FIXME == 0 */
}
dwRet
=
midiOutOpen
(
&
wmm
->
hMidi
,
MIDIMAPPER
,
0L
,
0L
,
CALLBACK_NULL
);
dwRet
=
midiOutOpen
(
(
LPHMIDIOUT
)
&
wmm
->
hMidi
,
MIDIMAPPER
,
0L
,
0L
,
CALLBACK_NULL
);
/* dwRet = midiInOpen(&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);*/
if
(
dwRet
!=
MMSYSERR_NOERROR
)
{
return
dwRet
;
...
...
@@ -1142,7 +1142,7 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
break
;
default:
if
(
doPlay
)
{
dwRet
=
midiOutShortMsg
(
wmm
->
hMidi
,
mmt
->
dwEventData
);
dwRet
=
midiOutShortMsg
(
(
HMIDIOUT
)
wmm
->
hMidi
,
mmt
->
dwEventData
);
}
else
{
switch
(
LOBYTE
(
LOWORD
(
mmt
->
dwEventData
))
&
0xF0
)
{
case
MIDI_NOTEON
:
...
...
@@ -1150,7 +1150,7 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
dwRet
=
0
;
break
;
default:
dwRet
=
midiOutShortMsg
(
wmm
->
hMidi
,
mmt
->
dwEventData
);
dwRet
=
midiOutShortMsg
(
(
HMIDIOUT
)
wmm
->
hMidi
,
mmt
->
dwEventData
);
}
}
}
...
...
@@ -1163,9 +1163,9 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
}
}
midiOutReset
(
wmm
->
hMidi
);
midiOutReset
(
(
HMIDIOUT
)
wmm
->
hMidi
);
dwRet
=
midiOutClose
(
wmm
->
hMidi
);
dwRet
=
midiOutClose
(
(
HMIDIOUT
)
wmm
->
hMidi
);
/* to restart playing at beginning when it's over */
wmm
->
dwPositionMS
=
0
;
...
...
@@ -1212,7 +1212,7 @@ static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
midiHdr
.
dwBufferLength
=
1024
;
midiHdr
.
dwUser
=
0L
;
midiHdr
.
dwFlags
=
0L
;
dwRet
=
midiInPrepareHeader
(
wmm
->
hMidi
,
&
midiHdr
,
sizeof
(
MIDIHDR
));
dwRet
=
midiInPrepareHeader
(
(
HMIDIIN
)
wmm
->
hMidi
,
&
midiHdr
,
sizeof
(
MIDIHDR
));
TRACE
(
"After MIDM_PREPARE
\n
"
);
wmm
->
dwStatus
=
MCI_MODE_RECORD
;
/* FIXME: there is no buffer added */
...
...
@@ -1220,12 +1220,12 @@ static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpPar
TRACE
(
"wmm->dwStatus=%p %d
\n
"
,
&
wmm
->
dwStatus
,
wmm
->
dwStatus
);
midiHdr
.
dwBytesRecorded
=
0
;
dwRet
=
midiInStart
(
wmm
->
hMidi
);
dwRet
=
midiInStart
(
(
HMIDIIN
)
wmm
->
hMidi
);
TRACE
(
"midiInStart => dwBytesRecorded=%lu
\n
"
,
midiHdr
.
dwBytesRecorded
);
if
(
midiHdr
.
dwBytesRecorded
==
0
)
break
;
}
TRACE
(
"Before MIDM_UNPREPARE
\n
"
);
dwRet
=
midiInUnprepareHeader
(
wmm
->
hMidi
,
&
midiHdr
,
sizeof
(
MIDIHDR
));
dwRet
=
midiInUnprepareHeader
(
(
HMIDIIN
)
wmm
->
hMidi
,
&
midiHdr
,
sizeof
(
MIDIHDR
));
TRACE
(
"After MIDM_UNPREPARE
\n
"
);
if
(
midiHdr
.
lpData
!=
NULL
)
{
HeapFree
(
GetProcessHeap
(),
0
,
midiHdr
.
lpData
);
...
...
@@ -1255,7 +1255,7 @@ static DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar
/* stop all notes */
unsigned
chn
;
for
(
chn
=
0
;
chn
<
16
;
chn
++
)
midiOutShortMsg
(
wmm
->
hMidi
,
0x78B0
|
chn
);
midiOutShortMsg
(
(
HMIDIOUT
)(
wmm
->
hMidi
)
,
0x78B0
|
chn
);
wmm
->
dwStatus
=
MCI_MODE_PAUSE
;
}
if
(
lpParms
&&
(
dwFlags
&
MCI_NOTIFY
))
{
...
...
@@ -1712,5 +1712,3 @@ LONG CALLBACK MCIMIDI_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
}
return
MCIERR_UNRECOGNIZED_COMMAND
;
}
dlls/winmm/midimap/midimap.c
View file @
7cae201e
...
...
@@ -81,7 +81,7 @@ typedef struct tagMIDIOUTPORT
{
char
name
[
MAXPNAMELEN
];
int
loaded
;
HMIDI
hMidi
;
HMIDI
OUT
hMidi
;
unsigned
short
uDevID
;
LPBYTE
lpbPatch
;
unsigned
int
aChn
[
16
];
...
...
@@ -494,7 +494,7 @@ static DWORD MIDIMAP_drvOpen(LPSTR str)
numMidiOutPorts
*
sizeof
(
MIDIOUTPORT
));
for
(
dev
=
0
;
dev
<
numMidiOutPorts
;
dev
++
)
{
if
(
midiOutGetDevCapsA
(
(
HMIDIOUT
)
dev
,
&
moc
,
sizeof
(
moc
))
==
0L
)
if
(
midiOutGetDevCapsA
(
dev
,
&
moc
,
sizeof
(
moc
))
==
0L
)
{
strcpy
(
midiOutPorts
[
dev
].
name
,
moc
.
szPname
);
midiOutPorts
[
dev
].
loaded
=
0
;
...
...
@@ -552,5 +552,3 @@ LONG CALLBACK MIDIMAP_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
return
DefDriverProc
(
dwDevID
,
hDriv
,
wMsg
,
dwParam1
,
dwParam2
);
}
}
dlls/winmm/mmsystem.c
View file @
7cae201e
...
...
@@ -2188,7 +2188,7 @@ static LPWINE_MIDI MIDI_OutAlloc(HMIDIOUT* lphMidiOut, LPDWORD lpdwCallback,
*
lphMidiOut
=
hMidiOut
;
if
(
lpwm
)
{
lpwm
->
mod
.
hMidi
=
hMidiOut
;
lpwm
->
mod
.
hMidi
=
(
HMIDI
)
hMidiOut
;
lpwm
->
mod
.
dwCallback
=
*
lpdwCallback
;
lpwm
->
mod
.
dwInstance
=
*
lpdwInstance
;
lpwm
->
mod
.
dnDevNode
=
0
;
...
...
@@ -2255,7 +2255,7 @@ UINT16 WINAPI midiOutOpen16(HMIDIOUT16* lphMidiOut, UINT16 uDeviceID,
ret
=
MMSYSTEM_midiOutOpen
(
&
hmo
,
uDeviceID
,
dwCallback
,
dwInstance
,
dwFlags
,
FALSE
);
if
(
lphMidiOut
!=
NULL
)
*
lphMidiOut
=
hmo
;
if
(
lphMidiOut
!=
NULL
)
*
lphMidiOut
=
HMIDIOUT_16
(
hmo
)
;
return
ret
;
}
...
...
@@ -2283,7 +2283,7 @@ UINT WINAPI midiOutClose(HMIDIOUT hMidiOut)
*/
UINT16
WINAPI
midiOutClose16
(
HMIDIOUT16
hMidiOut
)
{
return
midiOutClose
(
hMidiOut
);
return
midiOutClose
(
HMIDIOUT_32
(
hMidiOut
)
);
}
/**************************************************************************
...
...
@@ -2381,7 +2381,7 @@ UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg)
*/
UINT16
WINAPI
midiOutShortMsg16
(
HMIDIOUT16
hMidiOut
,
DWORD
dwMsg
)
{
return
midiOutShortMsg
(
hMidiOut
,
dwMsg
);
return
midiOutShortMsg
(
HMIDIOUT_32
(
hMidiOut
)
,
dwMsg
);
}
/**************************************************************************
...
...
@@ -2437,7 +2437,7 @@ UINT WINAPI midiOutReset(HMIDIOUT hMidiOut)
*/
UINT16
WINAPI
midiOutReset16
(
HMIDIOUT16
hMidiOut
)
{
return
midiOutReset
(
hMidiOut
);
return
midiOutReset
(
HMIDIOUT_32
(
hMidiOut
)
);
}
/**************************************************************************
...
...
@@ -2503,7 +2503,8 @@ UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut, UINT uBank,
UINT16
WINAPI
midiOutCachePatches16
(
HMIDIOUT16
hMidiOut
,
UINT16
uBank
,
WORD
*
lpwPatchArray
,
UINT16
uFlags
)
{
return
midiOutCachePatches
(
hMidiOut
,
uBank
,
lpwPatchArray
,
uFlags
);
return
midiOutCachePatches
(
HMIDIOUT_32
(
hMidiOut
),
uBank
,
lpwPatchArray
,
uFlags
);
}
/**************************************************************************
...
...
@@ -2739,7 +2740,7 @@ static UINT MMSYSTEM_midiInOpen(HMIDIIN* lphMidiIn, UINT uDeviceID, DWORD dwCall
if
(
lpwm
==
NULL
)
return
MMSYSERR_NOMEM
;
lpwm
->
mod
.
hMidi
=
hMidiIn
;
lpwm
->
mod
.
hMidi
=
(
HMIDI
)
hMidiIn
;
lpwm
->
mod
.
dwCallback
=
dwCallback
;
lpwm
->
mod
.
dwInstance
=
dwInstance
;
...
...
@@ -2778,7 +2779,7 @@ UINT16 WINAPI midiInOpen16(HMIDIIN16* lphMidiIn, UINT16 uDeviceID,
ret
=
MMSYSTEM_midiInOpen
(
&
xhmid
,
uDeviceID
,
dwCallback
,
dwInstance
,
dwFlags
,
FALSE
);
if
(
lphMidiIn
)
*
lphMidiIn
=
xhmid
;
if
(
lphMidiIn
)
*
lphMidiIn
=
HMIDIIN_16
(
xhmid
)
;
return
ret
;
}
...
...
@@ -2805,7 +2806,7 @@ UINT WINAPI midiInClose(HMIDIIN hMidiIn)
*/
UINT16
WINAPI
midiInClose16
(
HMIDIIN16
hMidiIn
)
{
return
midiInClose
(
hMidiIn
);
return
midiInClose
(
HMIDIIN_32
(
hMidiIn
)
);
}
/**************************************************************************
...
...
@@ -2936,7 +2937,7 @@ UINT WINAPI midiInStart(HMIDIIN hMidiIn)
*/
UINT16
WINAPI
midiInStart16
(
HMIDIIN16
hMidiIn
)
{
return
midiInStart
(
hMidiIn
);
return
midiInStart
(
HMIDIIN_32
(
hMidiIn
)
);
}
/**************************************************************************
...
...
@@ -2959,7 +2960,7 @@ UINT WINAPI midiInStop(HMIDIIN hMidiIn)
*/
UINT16
WINAPI
midiInStop16
(
HMIDIIN16
hMidiIn
)
{
return
midiInStop
(
hMidiIn
);
return
midiInStop
(
HMIDIIN_32
(
hMidiIn
)
);
}
/**************************************************************************
...
...
@@ -2982,7 +2983,7 @@ UINT WINAPI midiInReset(HMIDIIN hMidiIn)
*/
UINT16
WINAPI
midiInReset16
(
HMIDIIN16
hMidiIn
)
{
return
midiInReset
(
hMidiIn
);
return
midiInReset
(
HMIDIIN_32
(
hMidiIn
)
);
}
/**************************************************************************
...
...
@@ -3408,7 +3409,7 @@ MMRESULT WINAPI midiStreamClose(HMIDISTRM hMidiStrm)
HeapFree
(
GetProcessHeap
(),
0
,
lpMidiStrm
);
CloseHandle
(
lpMidiStrm
->
hEvent
);
return
midiOutClose
(
hMidiStrm
);
return
midiOutClose
(
(
HMIDIOUT
)
hMidiStrm
);
}
/**************************************************************************
...
...
@@ -3444,7 +3445,7 @@ static MMRESULT WINAPI MMSYSTEM_MidiStream_Open(HMIDISTRM* lphMidiStrm, LPUINT l
lpwm
=
MIDI_OutAlloc
(
&
hMidiOut
,
&
dwCallback
,
&
dwInstance
,
&
fdwOpen
,
1
,
&
mosm
,
bFrom32
);
lpMidiStrm
->
hDevice
=
hMidiOut
;
if
(
lphMidiStrm
)
*
lphMidiStrm
=
hMidiOut
;
*
lphMidiStrm
=
(
HMIDISTRM
)
hMidiOut
;
/* FIXME: is lpuDevice initialized upon entering midiStreamOpen ? */
FIXME
(
"*lpuDeviceID=%x
\n
"
,
*
lpuDeviceID
);
...
...
@@ -3673,7 +3674,7 @@ MMRESULT WINAPI midiStreamStop(HMIDISTRM hMidiStrm)
*/
MMRESULT16
WINAPI
midiStreamClose16
(
HMIDISTRM16
hMidiStrm
)
{
return
midiStreamClose
(
hMidiStrm
);
return
midiStreamClose
(
HMIDISTRM_32
(
hMidiStrm
)
);
}
/**************************************************************************
...
...
@@ -3692,7 +3693,7 @@ MMRESULT16 WINAPI midiStreamOpen16(HMIDISTRM16* phMidiStrm, LPUINT16 devid,
devid32
=
*
devid
;
ret
=
MMSYSTEM_MidiStream_Open
(
&
hMidiStrm32
,
&
devid32
,
cMidi
,
dwCallback
,
dwInstance
,
fdwOpen
,
FALSE
);
*
phMidiStrm
=
hMidiStrm32
;
*
phMidiStrm
=
HMIDISTRM_16
(
hMidiStrm32
)
;
*
devid
=
devid32
;
return
ret
;
}
...
...
@@ -3702,7 +3703,8 @@ MMRESULT16 WINAPI midiStreamOpen16(HMIDISTRM16* phMidiStrm, LPUINT16 devid,
*/
MMRESULT16
WINAPI
midiStreamOut16
(
HMIDISTRM16
hMidiStrm
,
LPMIDIHDR16
lpMidiHdr
,
UINT16
cbMidiHdr
)
{
return
midiStreamOut
(
hMidiStrm
,
(
LPMIDIHDR
)
lpMidiHdr
,
cbMidiHdr
);
return
midiStreamOut
(
HMIDISTRM_32
(
hMidiStrm
),
(
LPMIDIHDR
)
lpMidiHdr
,
cbMidiHdr
);
}
/**************************************************************************
...
...
@@ -3710,7 +3712,7 @@ MMRESULT16 WINAPI midiStreamOut16(HMIDISTRM16 hMidiStrm, LPMIDIHDR16 lpMidiHdr,
*/
MMRESULT16
WINAPI
midiStreamPause16
(
HMIDISTRM16
hMidiStrm
)
{
return
midiStreamPause
(
hMidiStrm
);
return
midiStreamPause
(
HMIDISTRM_32
(
hMidiStrm
)
);
}
/**************************************************************************
...
...
@@ -3724,7 +3726,7 @@ MMRESULT16 WINAPI midiStreamPosition16(HMIDISTRM16 hMidiStrm, LPMMTIME16 lpmmt16
if
(
!
lpmmt16
)
return
MMSYSERR_INVALPARAM
;
MMSYSTEM_MMTIME16to32
(
&
mmt32
,
lpmmt16
);
ret
=
midiStreamPosition
(
hMidiStrm
,
&
mmt32
,
sizeof
(
MMTIME
));
ret
=
midiStreamPosition
(
HMIDISTRM_32
(
hMidiStrm
)
,
&
mmt32
,
sizeof
(
MMTIME
));
MMSYSTEM_MMTIME32to16
(
lpmmt16
,
&
mmt32
);
return
ret
;
}
...
...
@@ -3734,7 +3736,7 @@ MMRESULT16 WINAPI midiStreamPosition16(HMIDISTRM16 hMidiStrm, LPMMTIME16 lpmmt16
*/
MMRESULT16
WINAPI
midiStreamProperty16
(
HMIDISTRM16
hMidiStrm
,
LPBYTE
lpPropData
,
DWORD
dwProperty
)
{
return
midiStreamProperty
(
hMidiStrm
,
lpPropData
,
dwProperty
);
return
midiStreamProperty
(
HMIDISTRM_32
(
hMidiStrm
)
,
lpPropData
,
dwProperty
);
}
/**************************************************************************
...
...
@@ -3742,7 +3744,7 @@ MMRESULT16 WINAPI midiStreamProperty16(HMIDISTRM16 hMidiStrm, LPBYTE lpPropData,
*/
MMRESULT16
WINAPI
midiStreamRestart16
(
HMIDISTRM16
hMidiStrm
)
{
return
midiStreamRestart
(
hMidiStrm
);
return
midiStreamRestart
(
HMIDISTRM_32
(
hMidiStrm
)
);
}
/**************************************************************************
...
...
@@ -3750,7 +3752,7 @@ MMRESULT16 WINAPI midiStreamRestart16(HMIDISTRM16 hMidiStrm)
*/
MMRESULT16
WINAPI
midiStreamStop16
(
HMIDISTRM16
hMidiStrm
)
{
return
midiStreamStop
(
hMidiStrm
);
return
midiStreamStop
(
HMIDISTRM_32
(
hMidiStrm
)
);
}
static
UINT
WINAPI
MMSYSTEM_waveOpen
(
HANDLE
*
lphndl
,
UINT
uDeviceID
,
UINT
uType
,
...
...
dlls/winmm/winemm.h
View file @
7cae201e
...
...
@@ -226,3 +226,14 @@ LPWINE_MM_IDATA MULTIMEDIA_GetIData(void);
LPWINE_MM_IDATA
TIME_MMTimeStart
(
void
);
void
TIME_MMTimeStop
(
void
);
/* HANDLE16 -> HANDLE conversions */
#define HMIDI_32(h16) ((HMIDI)(ULONG_PTR)(h16))
#define HMIDIIN_32(h16) ((HMIDIIN)(ULONG_PTR)(h16))
#define HMIDIOUT_32(h16) ((HMIDIOUT)(ULONG_PTR)(h16))
#define HMIDISTRM_32(h16) ((HMIDISTRM)(ULONG_PTR)(h16))
/* HANDLE -> HANDLE16 conversions */
#define HMIDI_16(h32) (LOWORD(h32))
#define HMIDIIN_16(h32) (LOWORD(h32))
#define HMIDIOUT_16(h32) (LOWORD(h32))
#define HMIDISTRM_16(h32) (LOWORD(h32))
include/mmsystem.h
View file @
7cae201e
...
...
@@ -34,10 +34,10 @@ DECLARE_OLD_HANDLE(HDRVR);
DECLARE_OLD_HANDLE
(
HWAVE
);
DECLARE_OLD_HANDLE
(
HWAVEIN
);
DECLARE_OLD_HANDLE
(
HWAVEOUT
);
DECLARE_
OLD_
HANDLE
(
HMIDI
);
DECLARE_
OLD_
HANDLE
(
HMIDIIN
);
DECLARE_
OLD_
HANDLE
(
HMIDIOUT
);
DECLARE_
OLD_
HANDLE
(
HMIDISTRM
);
DECLARE_HANDLE
(
HMIDI
);
DECLARE_HANDLE
(
HMIDIIN
);
DECLARE_HANDLE
(
HMIDIOUT
);
DECLARE_HANDLE
(
HMIDISTRM
);
DECLARE_OLD_HANDLE
(
HMIXER
);
DECLARE_OLD_HANDLE
(
HMIXEROBJ
);
DECLARE_OLD_HANDLE
(
HMMIO
);
...
...
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