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
d887b635
Commit
d887b635
authored
Jan 25, 2009
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
alsa: no CamelCase
Renamed types, functions, variables.
parent
27baf691
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
103 additions
and
93 deletions
+103
-93
alsa_plugin.c
src/output/alsa_plugin.c
+103
-93
No files found.
src/output/alsa_plugin.c
View file @
d887b635
...
...
@@ -40,38 +40,38 @@ enum {
typedef
snd_pcm_sframes_t
alsa_writei_t
(
snd_pcm_t
*
pcm
,
const
void
*
buffer
,
snd_pcm_uframes_t
size
);
typedef
struct
_AlsaD
ata
{
struct
alsa_d
ata
{
char
*
device
;
/** the mode flags passed to snd_pcm_open */
int
mode
;
snd_pcm_t
*
pcm
Handle
;
snd_pcm_t
*
pcm
;
alsa_writei_t
*
writei
;
unsigned
int
buffer_time
;
unsigned
int
period_time
;
int
sampleS
ize
;
int
useM
map
;
int
frame_s
ize
;
bool
use_m
map
;
struct
mixer
mixer
;
}
AlsaData
;
};
static
const
char
*
alsa_device
(
const
AlsaD
ata
*
ad
)
alsa_device
(
const
struct
alsa_d
ata
*
ad
)
{
return
ad
->
device
!=
NULL
?
ad
->
device
:
default_device
;
}
static
AlsaData
*
newAlsaData
(
void
)
static
struct
alsa_data
*
alsa_data_new
(
void
)
{
AlsaData
*
ret
=
g_new
(
AlsaD
ata
,
1
);
struct
alsa_data
*
ret
=
g_new
(
struct
alsa_d
ata
,
1
);
ret
->
device
=
NULL
;
ret
->
mode
=
0
;
ret
->
pcm
Handle
=
NULL
;
ret
->
pcm
=
NULL
;
ret
->
writei
=
snd_pcm_writei
;
ret
->
use
Mmap
=
0
;
ret
->
use
_mmap
=
false
;
ret
->
buffer_time
=
MPD_ALSA_BUFFER_TIME_US
;
ret
->
period_time
=
MPD_ALSA_PERIOD_TIME_US
;
...
...
@@ -81,7 +81,8 @@ static AlsaData *newAlsaData(void)
return
ret
;
}
static
void
freeAlsaData
(
AlsaData
*
ad
)
static
void
alsa_data_free
(
struct
alsa_data
*
ad
)
{
g_free
(
ad
->
device
);
mixer_finish
(
&
ad
->
mixer
);
...
...
@@ -89,11 +90,11 @@ static void freeAlsaData(AlsaData * ad)
}
static
void
alsa_configure
(
AlsaD
ata
*
ad
,
struct
config_param
*
param
)
alsa_configure
(
struct
alsa_d
ata
*
ad
,
struct
config_param
*
param
)
{
ad
->
device
=
config_dup_block_string
(
param
,
"device"
,
NULL
);
ad
->
use
M
map
=
config_get_block_bool
(
param
,
"use_mmap"
,
false
);
ad
->
use
_m
map
=
config_get_block_bool
(
param
,
"use_mmap"
,
false
);
ad
->
buffer_time
=
config_get_block_unsigned
(
param
,
"buffer_time"
,
MPD_ALSA_BUFFER_TIME_US
);
...
...
@@ -117,13 +118,13 @@ alsa_configure(AlsaData *ad, struct config_param *param)
}
static
void
*
alsa_init
Driver
(
G_GNUC_UNUSED
struct
audio_output
*
ao
,
G_GNUC_UNUSED
const
struct
audio_format
*
audio_format
,
struct
config_param
*
param
)
alsa_init
(
G_GNUC_UNUSED
struct
audio_output
*
ao
,
G_GNUC_UNUSED
const
struct
audio_format
*
audio_format
,
struct
config_param
*
param
)
{
/* no need for pthread_once thread-safety when reading config */
static
int
free_global_registered
;
AlsaData
*
ad
=
newAlsaData
();
struct
alsa_data
*
ad
=
alsa_data_new
();
if
(
!
free_global_registered
)
{
atexit
((
void
(
*
)(
void
))
snd_config_update_free_global
);
...
...
@@ -138,14 +139,16 @@ alsa_initDriver(G_GNUC_UNUSED struct audio_output *ao,
return
ad
;
}
static
void
alsa_finishDriver
(
void
*
data
)
static
void
alsa_finish
(
void
*
data
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
freeAlsaData
(
ad
);
alsa_data_free
(
ad
);
}
static
bool
alsa_testDefault
(
void
)
static
bool
alsa_test_default_device
(
void
)
{
snd_pcm_t
*
handle
;
...
...
@@ -161,7 +164,8 @@ static bool alsa_testDefault(void)
return
true
;
}
static
snd_pcm_format_t
get_bitformat
(
const
struct
audio_format
*
af
)
static
snd_pcm_format_t
get_bitformat
(
const
struct
audio_format
*
af
)
{
switch
(
af
->
bits
)
{
case
8
:
return
SND_PCM_FORMAT_S8
;
...
...
@@ -172,14 +176,15 @@ static snd_pcm_format_t get_bitformat(const struct audio_format *af)
return
SND_PCM_FORMAT_UNKNOWN
;
}
static
bool
alsa_openDevice
(
void
*
data
,
struct
audio_format
*
audioFormat
)
static
bool
alsa_open
(
void
*
data
,
struct
audio_format
*
audio_format
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
snd_pcm_format_t
bitformat
;
snd_pcm_hw_params_t
*
hwparams
;
snd_pcm_sw_params_t
*
swparams
;
unsigned
int
sample_rate
=
audio
F
ormat
->
sample_rate
;
unsigned
int
channels
=
audio
F
ormat
->
channels
;
unsigned
int
sample_rate
=
audio
_f
ormat
->
sample_rate
;
unsigned
int
channels
=
audio
_f
ormat
->
channels
;
snd_pcm_uframes_t
alsa_buffer_size
;
snd_pcm_uframes_t
alsa_period_size
;
int
err
;
...
...
@@ -190,14 +195,14 @@ static bool alsa_openDevice(void *data, struct audio_format *audioFormat)
mixer_open
(
&
ad
->
mixer
);
if
((
bitformat
=
get_bitformat
(
audio
F
ormat
))
==
SND_PCM_FORMAT_UNKNOWN
)
if
((
bitformat
=
get_bitformat
(
audio
_f
ormat
))
==
SND_PCM_FORMAT_UNKNOWN
)
g_warning
(
"ALSA device
\"
%s
\"
doesn't support %u bit audio
\n
"
,
alsa_device
(
ad
),
audio
F
ormat
->
bits
);
alsa_device
(
ad
),
audio
_f
ormat
->
bits
);
err
=
snd_pcm_open
(
&
ad
->
pcm
Handle
,
alsa_device
(
ad
),
err
=
snd_pcm_open
(
&
ad
->
pcm
,
alsa_device
(
ad
),
SND_PCM_STREAM_PLAYBACK
,
ad
->
mode
);
if
(
err
<
0
)
{
ad
->
pcm
Handle
=
NULL
;
ad
->
pcm
=
NULL
;
goto
error
;
}
...
...
@@ -207,72 +212,72 @@ configure_hw:
snd_pcm_hw_params_alloca
(
&
hwparams
);
cmd
=
"snd_pcm_hw_params_any"
;
err
=
snd_pcm_hw_params_any
(
ad
->
pcm
Handle
,
hwparams
);
err
=
snd_pcm_hw_params_any
(
ad
->
pcm
,
hwparams
);
if
(
err
<
0
)
goto
error
;
if
(
ad
->
use
M
map
)
{
err
=
snd_pcm_hw_params_set_access
(
ad
->
pcm
Handle
,
hwparams
,
if
(
ad
->
use
_m
map
)
{
err
=
snd_pcm_hw_params_set_access
(
ad
->
pcm
,
hwparams
,
SND_PCM_ACCESS_MMAP_INTERLEAVED
);
if
(
err
<
0
)
{
g_warning
(
"Cannot set mmap'ed mode on ALSA device
\"
%s
\"
: %s
\n
"
,
alsa_device
(
ad
),
snd_strerror
(
-
err
));
g_warning
(
"Falling back to direct write mode
\n
"
);
ad
->
use
Mmap
=
0
;
ad
->
use
_mmap
=
false
;
}
else
ad
->
writei
=
snd_pcm_mmap_writei
;
}
if
(
!
ad
->
use
M
map
)
{
if
(
!
ad
->
use
_m
map
)
{
cmd
=
"snd_pcm_hw_params_set_access"
;
err
=
snd_pcm_hw_params_set_access
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_access
(
ad
->
pcm
,
hwparams
,
SND_PCM_ACCESS_RW_INTERLEAVED
);
if
(
err
<
0
)
goto
error
;
ad
->
writei
=
snd_pcm_writei
;
}
err
=
snd_pcm_hw_params_set_format
(
ad
->
pcm
Handle
,
hwparams
,
bitformat
);
if
(
err
==
-
EINVAL
&&
audio
F
ormat
->
bits
!=
16
)
{
err
=
snd_pcm_hw_params_set_format
(
ad
->
pcm
,
hwparams
,
bitformat
);
if
(
err
==
-
EINVAL
&&
audio
_f
ormat
->
bits
!=
16
)
{
/* fall back to 16 bit, let pcm_convert.c do the conversion */
err
=
snd_pcm_hw_params_set_format
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_format
(
ad
->
pcm
,
hwparams
,
SND_PCM_FORMAT_S16
);
if
(
err
==
0
)
{
g_debug
(
"ALSA device
\"
%s
\"
: converting %u bit to 16 bit
\n
"
,
alsa_device
(
ad
),
audio
F
ormat
->
bits
);
audio
F
ormat
->
bits
=
16
;
alsa_device
(
ad
),
audio
_f
ormat
->
bits
);
audio
_f
ormat
->
bits
=
16
;
}
}
if
(
err
<
0
)
{
g_warning
(
"ALSA device
\"
%s
\"
does not support %u bit audio: %s
\n
"
,
alsa_device
(
ad
),
audio
F
ormat
->
bits
,
snd_strerror
(
-
err
));
alsa_device
(
ad
),
audio
_f
ormat
->
bits
,
snd_strerror
(
-
err
));
goto
fail
;
}
err
=
snd_pcm_hw_params_set_channels_near
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_channels_near
(
ad
->
pcm
,
hwparams
,
&
channels
);
if
(
err
<
0
)
{
g_warning
(
"ALSA device
\"
%s
\"
does not support %i channels: %s
\n
"
,
alsa_device
(
ad
),
(
int
)
audio
F
ormat
->
channels
,
alsa_device
(
ad
),
(
int
)
audio
_f
ormat
->
channels
,
snd_strerror
(
-
err
));
goto
fail
;
}
audio
F
ormat
->
channels
=
(
int8_t
)
channels
;
audio
_f
ormat
->
channels
=
(
int8_t
)
channels
;
err
=
snd_pcm_hw_params_set_rate_near
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_rate_near
(
ad
->
pcm
,
hwparams
,
&
sample_rate
,
NULL
);
if
(
err
<
0
||
sample_rate
==
0
)
{
g_warning
(
"ALSA device
\"
%s
\"
does not support %u Hz audio
\n
"
,
alsa_device
(
ad
),
audio
F
ormat
->
sample_rate
);
alsa_device
(
ad
),
audio
_f
ormat
->
sample_rate
);
goto
fail
;
}
audio
F
ormat
->
sample_rate
=
sample_rate
;
audio
_f
ormat
->
sample_rate
=
sample_rate
;
if
(
ad
->
buffer_time
>
0
)
{
buffer_time
=
ad
->
buffer_time
;
cmd
=
"snd_pcm_hw_params_set_buffer_time_near"
;
err
=
snd_pcm_hw_params_set_buffer_time_near
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_buffer_time_near
(
ad
->
pcm
,
hwparams
,
&
buffer_time
,
NULL
);
if
(
err
<
0
)
goto
error
;
...
...
@@ -281,14 +286,14 @@ configure_hw:
if
(
period_time_ro
>
0
)
{
period_time
=
period_time_ro
;
cmd
=
"snd_pcm_hw_params_set_period_time_near"
;
err
=
snd_pcm_hw_params_set_period_time_near
(
ad
->
pcm
Handle
,
hwparams
,
err
=
snd_pcm_hw_params_set_period_time_near
(
ad
->
pcm
,
hwparams
,
&
period_time
,
NULL
);
if
(
err
<
0
)
goto
error
;
}
cmd
=
"snd_pcm_hw_params"
;
err
=
snd_pcm_hw_params
(
ad
->
pcm
Handle
,
hwparams
);
err
=
snd_pcm_hw_params
(
ad
->
pcm
,
hwparams
);
if
(
err
==
-
EPIPE
&&
--
retry
>
0
&&
period_time_ro
>
0
)
{
period_time_ro
=
period_time_ro
>>
1
;
goto
configure_hw
;
...
...
@@ -312,32 +317,32 @@ configure_hw:
snd_pcm_sw_params_alloca
(
&
swparams
);
cmd
=
"snd_pcm_sw_params_current"
;
err
=
snd_pcm_sw_params_current
(
ad
->
pcm
Handle
,
swparams
);
err
=
snd_pcm_sw_params_current
(
ad
->
pcm
,
swparams
);
if
(
err
<
0
)
goto
error
;
cmd
=
"snd_pcm_sw_params_set_start_threshold"
;
err
=
snd_pcm_sw_params_set_start_threshold
(
ad
->
pcm
Handle
,
swparams
,
err
=
snd_pcm_sw_params_set_start_threshold
(
ad
->
pcm
,
swparams
,
alsa_buffer_size
-
alsa_period_size
);
if
(
err
<
0
)
goto
error
;
cmd
=
"snd_pcm_sw_params_set_avail_min"
;
err
=
snd_pcm_sw_params_set_avail_min
(
ad
->
pcm
Handle
,
swparams
,
err
=
snd_pcm_sw_params_set_avail_min
(
ad
->
pcm
,
swparams
,
alsa_period_size
);
if
(
err
<
0
)
goto
error
;
cmd
=
"snd_pcm_sw_params"
;
err
=
snd_pcm_sw_params
(
ad
->
pcm
Handle
,
swparams
);
err
=
snd_pcm_sw_params
(
ad
->
pcm
,
swparams
);
if
(
err
<
0
)
goto
error
;
ad
->
sampleSize
=
audio_format_frame_size
(
audioF
ormat
);
ad
->
frame_size
=
audio_format_frame_size
(
audio_f
ormat
);
g_debug
(
"ALSA device
\"
%s
\"
will be playing %i bit, %u channel audio at %u Hz
\n
"
,
alsa_device
(
ad
),
audio
F
ormat
->
bits
,
channels
,
sample_rate
);
alsa_device
(
ad
),
audio
_f
ormat
->
bits
,
channels
,
sample_rate
);
return
true
;
...
...
@@ -350,13 +355,14 @@ error:
alsa_device
(
ad
),
snd_strerror
(
-
err
));
}
fail:
if
(
ad
->
pcm
Handle
)
snd_pcm_close
(
ad
->
pcm
Handle
);
ad
->
pcm
Handle
=
NULL
;
if
(
ad
->
pcm
)
snd_pcm_close
(
ad
->
pcm
);
ad
->
pcm
=
NULL
;
return
false
;
}
static
int
alsa_errorRecovery
(
AlsaData
*
ad
,
int
err
)
static
int
alsa_recover
(
struct
alsa_data
*
ad
,
int
err
)
{
if
(
err
==
-
EPIPE
)
{
g_debug
(
"Underrun on ALSA device
\"
%s
\"\n
"
,
alsa_device
(
ad
));
...
...
@@ -364,23 +370,23 @@ static int alsa_errorRecovery(AlsaData * ad, int err)
g_debug
(
"ALSA device
\"
%s
\"
was suspended
\n
"
,
alsa_device
(
ad
));
}
switch
(
snd_pcm_state
(
ad
->
pcm
Handle
))
{
switch
(
snd_pcm_state
(
ad
->
pcm
))
{
case
SND_PCM_STATE_PAUSED
:
err
=
snd_pcm_pause
(
ad
->
pcm
Handle
,
/* disable */
0
);
err
=
snd_pcm_pause
(
ad
->
pcm
,
/* disable */
0
);
break
;
case
SND_PCM_STATE_SUSPENDED
:
err
=
snd_pcm_resume
(
ad
->
pcm
Handle
);
err
=
snd_pcm_resume
(
ad
->
pcm
);
if
(
err
==
-
EAGAIN
)
return
0
;
/* fall-through to snd_pcm_prepare: */
case
SND_PCM_STATE_SETUP
:
case
SND_PCM_STATE_XRUN
:
err
=
snd_pcm_prepare
(
ad
->
pcm
Handle
);
err
=
snd_pcm_prepare
(
ad
->
pcm
);
break
;
case
SND_PCM_STATE_DISCONNECTED
:
/* so alsa_closeDevice won't try to drain: */
snd_pcm_close
(
ad
->
pcm
Handle
);
ad
->
pcm
Handle
=
NULL
;
snd_pcm_close
(
ad
->
pcm
);
ad
->
pcm
=
NULL
;
break
;
/* this is no error, so just keep running */
case
SND_PCM_STATE_RUNNING
:
...
...
@@ -394,52 +400,56 @@ static int alsa_errorRecovery(AlsaData * ad, int err)
return
err
;
}
static
void
alsa_dropBufferedAudio
(
void
*
data
)
static
void
alsa_cancel
(
void
*
data
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
alsa_
errorRecovery
(
ad
,
snd_pcm_drop
(
ad
->
pcmHandle
));
alsa_
recover
(
ad
,
snd_pcm_drop
(
ad
->
pcm
));
}
static
void
alsa_closeDevice
(
void
*
data
)
static
void
alsa_close
(
void
*
data
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
if
(
ad
->
pcm
Handle
)
{
if
(
snd_pcm_state
(
ad
->
pcm
Handle
)
==
SND_PCM_STATE_RUNNING
)
{
snd_pcm_drain
(
ad
->
pcm
Handle
);
}
snd_pcm_close
(
ad
->
pcm
Handle
);
ad
->
pcm
Handle
=
NULL
;
if
(
ad
->
pcm
!=
NULL
)
{
if
(
snd_pcm_state
(
ad
->
pcm
)
==
SND_PCM_STATE_RUNNING
)
snd_pcm_drain
(
ad
->
pcm
);
snd_pcm_close
(
ad
->
pcm
);
ad
->
pcm
=
NULL
;
}
mixer_close
(
&
ad
->
mixer
);
}
static
bool
alsa_play
Audio
(
void
*
data
,
const
char
*
playC
hunk
,
size_t
size
)
alsa_play
(
void
*
data
,
const
char
*
c
hunk
,
size_t
size
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
int
ret
;
size
/=
ad
->
sampleS
ize
;
size
/=
ad
->
frame_s
ize
;
while
(
size
>
0
)
{
ret
=
ad
->
writei
(
ad
->
pcm
Handle
,
playC
hunk
,
size
);
ret
=
ad
->
writei
(
ad
->
pcm
,
c
hunk
,
size
);
if
(
ret
==
-
EAGAIN
||
ret
==
-
EINTR
)
continue
;
if
(
ret
<
0
)
{
if
(
alsa_
errorRecovery
(
ad
,
ret
)
<
0
)
{
if
(
alsa_
recover
(
ad
,
ret
)
<
0
)
{
g_warning
(
"closing ALSA device
\"
%s
\"
due to write "
"error: %s
\n
"
,
alsa_device
(
ad
),
snd_strerror
(
-
errno
));
return
false
;
}
continue
;
}
playChunk
+=
ret
*
ad
->
sampleS
ize
;
chunk
+=
ret
*
ad
->
frame_s
ize
;
size
-=
ret
;
}
...
...
@@ -449,18 +459,18 @@ alsa_playAudio(void *data, const char *playChunk, size_t size)
static
bool
alsa_control
(
void
*
data
,
int
cmd
,
void
*
arg
)
{
AlsaD
ata
*
ad
=
data
;
struct
alsa_d
ata
*
ad
=
data
;
return
mixer_control
(
&
ad
->
mixer
,
cmd
,
arg
);
}
const
struct
audio_output_plugin
alsaPlugin
=
{
.
name
=
"alsa"
,
.
test_default_device
=
alsa_test
Default
,
.
init
=
alsa_init
Driver
,
.
finish
=
alsa_finish
Driver
,
.
open
=
alsa_open
Device
,
.
play
=
alsa_play
Audio
,
.
cancel
=
alsa_
dropBufferedAudio
,
.
close
=
alsa_close
Device
,
.
test_default_device
=
alsa_test
_default_device
,
.
init
=
alsa_init
,
.
finish
=
alsa_finish
,
.
open
=
alsa_open
,
.
play
=
alsa_play
,
.
cancel
=
alsa_
cancel
,
.
close
=
alsa_close
,
.
control
=
alsa_control
};
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