Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
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
Иван Мажукин
mpd
Commits
704a28ca
Commit
704a28ca
authored
Jan 25, 2017
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
output/solaris: use AudioOutputWrapper
parent
8d70d10a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
49 deletions
+39
-49
SolarisOutputPlugin.cxx
src/output/plugins/SolarisOutputPlugin.cxx
+39
-49
No files found.
src/output/plugins/SolarisOutputPlugin.cxx
View file @
704a28ca
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include "config.h"
#include "config.h"
#include "SolarisOutputPlugin.hxx"
#include "SolarisOutputPlugin.hxx"
#include "../OutputAPI.hxx"
#include "../OutputAPI.hxx"
#include "../Wrapper.hxx"
#include "system/fd_util.h"
#include "system/fd_util.h"
#include "system/Error.hxx"
#include "system/Error.hxx"
...
@@ -60,6 +61,16 @@ struct SolarisOutput {
...
@@ -60,6 +61,16 @@ struct SolarisOutput {
explicit
SolarisOutput
(
const
ConfigBlock
&
block
)
explicit
SolarisOutput
(
const
ConfigBlock
&
block
)
:
base
(
solaris_output_plugin
,
block
),
:
base
(
solaris_output_plugin
,
block
),
device
(
block
.
GetBlockValue
(
"device"
,
"/dev/audio"
))
{}
device
(
block
.
GetBlockValue
(
"device"
,
"/dev/audio"
))
{}
static
SolarisOutput
*
Create
(
const
ConfigBlock
&
block
)
{
return
new
SolarisOutput
(
block
);
}
void
Open
(
AudioFormat
&
audio_format
);
void
Close
();
size_t
Play
(
const
void
*
chunk
,
size_t
size
);
void
Cancel
();
};
};
static
bool
static
bool
...
@@ -71,25 +82,9 @@ solaris_output_test_default_device(void)
...
@@ -71,25 +82,9 @@ solaris_output_test_default_device(void)
access
(
"/dev/audio"
,
W_OK
)
==
0
;
access
(
"/dev/audio"
,
W_OK
)
==
0
;
}
}
static
AudioOutput
*
void
solaris_output_init
(
const
ConfigBlock
&
block
)
SolarisOutput
::
Open
(
AudioFormat
&
audio_format
)
{
{
SolarisOutput
*
so
=
new
SolarisOutput
(
block
);
return
&
so
->
base
;
}
static
void
solaris_output_finish
(
AudioOutput
*
ao
)
{
SolarisOutput
*
so
=
(
SolarisOutput
*
)
ao
;
delete
so
;
}
static
void
solaris_output_open
(
AudioOutput
*
ao
,
AudioFormat
&
audio_format
)
{
SolarisOutput
*
so
=
(
SolarisOutput
*
)
ao
;
struct
audio_info
info
;
struct
audio_info
info
;
int
ret
,
flags
;
int
ret
,
flags
;
...
@@ -99,23 +94,23 @@ solaris_output_open(AudioOutput *ao, AudioFormat &audio_format)
...
@@ -99,23 +94,23 @@ solaris_output_open(AudioOutput *ao, AudioFormat &audio_format)
/* open the device in non-blocking mode */
/* open the device in non-blocking mode */
so
->
fd
=
open_cloexec
(
so
->
device
,
O_WRONLY
|
O_NONBLOCK
,
0
);
fd
=
open_cloexec
(
device
,
O_WRONLY
|
O_NONBLOCK
,
0
);
if
(
so
->
fd
<
0
)
if
(
fd
<
0
)
throw
FormatErrno
(
"Failed to open %s"
,
throw
FormatErrno
(
"Failed to open %s"
,
so
->
device
);
device
);
/* restore blocking mode */
/* restore blocking mode */
flags
=
fcntl
(
so
->
fd
,
F_GETFL
);
flags
=
fcntl
(
fd
,
F_GETFL
);
if
(
flags
>
0
&&
(
flags
&
O_NONBLOCK
)
!=
0
)
if
(
flags
>
0
&&
(
flags
&
O_NONBLOCK
)
!=
0
)
fcntl
(
so
->
fd
,
F_SETFL
,
flags
&
~
O_NONBLOCK
);
fcntl
(
fd
,
F_SETFL
,
flags
&
~
O_NONBLOCK
);
/* configure the audio device */
/* configure the audio device */
ret
=
ioctl
(
so
->
fd
,
AUDIO_GETINFO
,
&
info
);
ret
=
ioctl
(
fd
,
AUDIO_GETINFO
,
&
info
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
const
int
e
=
errno
;
const
int
e
=
errno
;
close
(
so
->
fd
);
close
(
fd
);
throw
MakeErrno
(
e
,
"AUDIO_GETINFO failed"
);
throw
MakeErrno
(
e
,
"AUDIO_GETINFO failed"
);
}
}
...
@@ -124,57 +119,52 @@ solaris_output_open(AudioOutput *ao, AudioFormat &audio_format)
...
@@ -124,57 +119,52 @@ solaris_output_open(AudioOutput *ao, AudioFormat &audio_format)
info
.
play
.
precision
=
16
;
info
.
play
.
precision
=
16
;
info
.
play
.
encoding
=
AUDIO_ENCODING_LINEAR
;
info
.
play
.
encoding
=
AUDIO_ENCODING_LINEAR
;
ret
=
ioctl
(
so
->
fd
,
AUDIO_SETINFO
,
&
info
);
ret
=
ioctl
(
fd
,
AUDIO_SETINFO
,
&
info
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
const
int
e
=
errno
;
const
int
e
=
errno
;
close
(
so
->
fd
);
close
(
fd
);
throw
MakeErrno
(
e
,
"AUDIO_SETINFO failed"
);
throw
MakeErrno
(
e
,
"AUDIO_SETINFO failed"
);
}
}
}
}
static
void
void
solaris_output_close
(
AudioOutput
*
ao
)
SolarisOutput
::
Close
(
)
{
{
SolarisOutput
*
so
=
(
SolarisOutput
*
)
ao
;
close
(
fd
);
close
(
so
->
fd
);
}
}
s
tatic
s
ize_t
size_t
solaris_output_play
(
AudioOutput
*
ao
,
const
void
*
chunk
,
size_t
size
)
SolarisOutput
::
Play
(
const
void
*
chunk
,
size_t
size
)
{
{
SolarisOutput
*
so
=
(
SolarisOutput
*
)
ao
;
ssize_t
nbytes
=
write
(
fd
,
chunk
,
size
);
ssize_t
nbytes
;
nbytes
=
write
(
so
->
fd
,
chunk
,
size
);
if
(
nbytes
<=
0
)
if
(
nbytes
<=
0
)
throw
MakeErrno
(
"Write failed"
);
throw
MakeErrno
(
"Write failed"
);
return
nbytes
;
return
nbytes
;
}
}
static
void
void
solaris_output_cancel
(
AudioOutput
*
ao
)
SolarisOutput
::
Cancel
(
)
{
{
SolarisOutput
*
so
=
(
SolarisOutput
*
)
ao
;
ioctl
(
fd
,
I_FLUSH
);
ioctl
(
so
->
fd
,
I_FLUSH
);
}
}
typedef
AudioOutputWrapper
<
SolarisOutput
>
Wrapper
;
const
struct
AudioOutputPlugin
solaris_output_plugin
=
{
const
struct
AudioOutputPlugin
solaris_output_plugin
=
{
"solaris"
,
"solaris"
,
solaris_output_test_default_device
,
solaris_output_test_default_device
,
solaris_output_i
nit
,
&
Wrapper
::
I
nit
,
solaris_output_f
inish
,
&
Wrapper
::
F
inish
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
solaris_output_o
pen
,
&
Wrapper
::
O
pen
,
solaris_output_c
lose
,
&
Wrapper
::
C
lose
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
solaris_output_p
lay
,
&
Wrapper
::
P
lay
,
nullptr
,
nullptr
,
solaris_output_c
ancel
,
&
Wrapper
::
C
ancel
,
nullptr
,
nullptr
,
nullptr
,
nullptr
,
};
};
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