madplay: add alsa build variant
Signed-off-by: John Crispin <blogic@openwrt.org>
This commit is contained in:
parent
d88a1494fd
commit
224ead0d5b
2 changed files with 193 additions and 5 deletions
|
@ -24,11 +24,12 @@ PKG_INSTALL:=1
|
|||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/madplay
|
||||
define Package/madplay/default
|
||||
SECTION:=sound
|
||||
CATEGORY:=Sound
|
||||
DEPENDS:=+libid3tag +libmad
|
||||
TITLE:=MPEG audio player in fixed point
|
||||
TITLE:=MPEG audio player in fixed point - $(1)
|
||||
VARIANT:=$(1)
|
||||
URL:=http://sourceforge.net/projects/mad
|
||||
endef
|
||||
|
||||
|
@ -39,6 +40,9 @@ define Package/madplay/description
|
|||
full support for ID3 tags.
|
||||
endef
|
||||
|
||||
Package/madplay-alsa=$(call Package/madplay/default,alsa)
|
||||
Package/madplay-oss=$(call Package/madplay/default,oss)
|
||||
|
||||
define Build/Configure
|
||||
$(call Build/Configure/Default, \
|
||||
--enable-shared \
|
||||
|
@ -48,16 +52,27 @@ define Build/Configure
|
|||
--disable-experimental \
|
||||
--without-libiconv-prefix \
|
||||
--without-libintl-prefix \
|
||||
--without-alsa \
|
||||
--without-esd \
|
||||
, \
|
||||
LIBS="-lz" \
|
||||
)
|
||||
endef
|
||||
|
||||
define Package/madplay/install
|
||||
ifeq ($(BUILD_VARIANT),madplay-alsa)
|
||||
CONFIGURE_ARGS += \
|
||||
--without-oss \
|
||||
--with-alsa
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_VARIANT),madplay-oss)
|
||||
CONFIGURE_ARGS += \
|
||||
--without-alsa
|
||||
endif
|
||||
|
||||
define Package/madplay-$(BUILD_VARIANT)/install
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/madplay $(1)/usr/bin/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,madplay))
|
||||
$(eval $(call BuildPackage,madplay-alsa))
|
||||
$(eval $(call BuildPackage,madplay-oss))
|
||||
|
|
173
sound/madplay/patches/0001-switch-to-new-alsa-api.patch
Normal file
173
sound/madplay/patches/0001-switch-to-new-alsa-api.patch
Normal file
|
@ -0,0 +1,173 @@
|
|||
Switch madplay to the new API. This is done thanks to a patch written
|
||||
by Micha Nelissen <micha@neli.hopto.org> and available at
|
||||
http://article.gmane.org/gmane.comp.audio.mad.devel/729.
|
||||
|
||||
--- madplay-0.15.2b/audio_alsa.c 2008-10-18 15:10:16.000000000 +0200
|
||||
+++ madplay-0.15.2b/audio_alsa.c.new 2008-10-18 15:03:27.000000000 +0200
|
||||
@@ -28,31 +28,30 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
-#define ALSA_PCM_OLD_HW_PARAMS_API
|
||||
-#define ALSA_PCM_OLD_SW_PARAMS_API
|
||||
#include <alsa/asoundlib.h>
|
||||
|
||||
#include <mad.h>
|
||||
|
||||
#include "audio.h"
|
||||
|
||||
-char *buf = NULL;
|
||||
-int paused = 0;
|
||||
+#define BUFFER_TIME_MAX 500000
|
||||
|
||||
-int rate = -1;
|
||||
-int channels = -1;
|
||||
-int bitdepth = -1;
|
||||
-int sample_size = -1;
|
||||
-
|
||||
-int buffer_time = 500000;
|
||||
-int period_time = 100000;
|
||||
-char *defaultdev = "plughw:0,0";
|
||||
+unsigned char *buf = NULL;
|
||||
+int paused = 0;
|
||||
+
|
||||
+unsigned int rate = 0;
|
||||
+unsigned int channels = -1;
|
||||
+unsigned int bitdepth = -1;
|
||||
+unsigned int sample_size = -1;
|
||||
+
|
||||
+unsigned int buffer_time;
|
||||
+unsigned int period_time;
|
||||
+char *defaultdev = "plughw:0,0";
|
||||
|
||||
snd_pcm_hw_params_t *alsa_hwparams;
|
||||
snd_pcm_sw_params_t *alsa_swparams;
|
||||
|
||||
-snd_pcm_sframes_t buffer_size;
|
||||
-snd_pcm_sframes_t period_size;
|
||||
+snd_pcm_uframes_t buffer_size;
|
||||
|
||||
snd_pcm_format_t alsa_format = -1;
|
||||
snd_pcm_access_t alsa_access = SND_PCM_ACCESS_MMAP_INTERLEAVED;
|
||||
@@ -66,14 +65,20 @@
|
||||
snd_pcm_hw_params_t *params,
|
||||
snd_pcm_access_t access)
|
||||
{
|
||||
- int err, dir;
|
||||
-
|
||||
+ int err;
|
||||
+
|
||||
/* choose all parameters */
|
||||
err = snd_pcm_hw_params_any(handle,params);
|
||||
if (err < 0) {
|
||||
printf("Access type not available for playback: %s\n", snd_strerror(err));
|
||||
return err;
|
||||
}
|
||||
+ /* set the access type */
|
||||
+ err = snd_pcm_hw_params_set_access(handle, params, alsa_access);
|
||||
+ if (err < 0) {
|
||||
+ printf("Sample format not available for playback: %s\n", snd_strerror(err));
|
||||
+ return err;
|
||||
+ }
|
||||
/* set the sample format */
|
||||
err = snd_pcm_hw_params_set_format(handle, params, alsa_format);
|
||||
if (err < 0) {
|
||||
@@ -87,29 +92,38 @@
|
||||
return err;
|
||||
}
|
||||
/* set the stream rate */
|
||||
- err = snd_pcm_hw_params_set_rate_near(handle, params, rate, 0);
|
||||
+ err = snd_pcm_hw_params_set_rate(handle, params, rate, 0);
|
||||
if (err < 0) {
|
||||
printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
|
||||
return err;
|
||||
}
|
||||
- if (err != rate) {
|
||||
- printf("Rate doesn't match (requested %iHz, get %iHz)\n", rate, err);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ err = snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, NULL);
|
||||
+ if (err < 0) {
|
||||
+ printf("Unable to retrieve buffer time: %s\n", snd_strerror(err));
|
||||
+ return err;
|
||||
+ }
|
||||
+ if (buffer_time > BUFFER_TIME_MAX)
|
||||
+ buffer_time = BUFFER_TIME_MAX;
|
||||
/* set buffer time */
|
||||
- err = snd_pcm_hw_params_set_buffer_time_near(handle, params, buffer_time, &dir);
|
||||
+ err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);
|
||||
if (err < 0) {
|
||||
printf("Unable to set buffer time %i for playback: %s\n", buffer_time, snd_strerror(err));
|
||||
return err;
|
||||
}
|
||||
- buffer_size = snd_pcm_hw_params_get_buffer_size(params);
|
||||
+ if (period_time * 4 > buffer_time)
|
||||
+ period_time = buffer_time / 4;
|
||||
/* set period time */
|
||||
- err = snd_pcm_hw_params_set_period_time_near(handle, params, period_time, &dir);
|
||||
+ err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, NULL);
|
||||
if (err < 0) {
|
||||
printf("Unable to set period time %i for playback: %s\n", period_time, snd_strerror(err));
|
||||
return err;
|
||||
}
|
||||
- period_size = snd_pcm_hw_params_get_period_size(params, &dir);
|
||||
+ /* retrieve buffer size */
|
||||
+ err = snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
|
||||
+ if (err < 0) {
|
||||
+ printf("Unable to retrieve buffer size: %s\n", snd_strerror(err));
|
||||
+ return err;
|
||||
+ }
|
||||
/* write the parameters to device */
|
||||
err = snd_pcm_hw_params(handle, params);
|
||||
if (err < 0) {
|
||||
@@ -123,6 +137,7 @@
|
||||
int set_swparams(snd_pcm_t *handle,
|
||||
snd_pcm_sw_params_t *params)
|
||||
{
|
||||
+ unsigned int start_threshold;
|
||||
int err;
|
||||
|
||||
/* get current swparams */
|
||||
@@ -136,13 +151,7 @@
|
||||
if (err < 0) {
|
||||
printf("Unable to set start threshold mode for playback: %s\n", snd_strerror(err));
|
||||
return err;
|
||||
- }
|
||||
- /* allow transfer when at least period_size samples can be processed */
|
||||
- err = snd_pcm_sw_params_set_avail_min(handle, params, period_size);
|
||||
- if (err < 0) {
|
||||
- printf("Unable to set avail min for playback: %s\n", snd_strerror(err));
|
||||
- return err;
|
||||
- }
|
||||
+ }
|
||||
/* align all transfers to 1 samples */
|
||||
err = snd_pcm_sw_params_set_xfer_align(handle, params, 1);
|
||||
if (err < 0) {
|
||||
@@ -190,7 +199,7 @@
|
||||
rate = config->speed;
|
||||
|
||||
if ( bitdepth == 0 )
|
||||
- config->precision = bitdepth = 32;
|
||||
+ config->precision = bitdepth = 16;
|
||||
|
||||
switch (bitdepth)
|
||||
{
|
||||
@@ -241,7 +250,7 @@
|
||||
return -1;
|
||||
}
|
||||
|
||||
- buf = malloc(buffer_size);
|
||||
+ buf = malloc(buffer_size * sample_size);
|
||||
if (buf == NULL) {
|
||||
audio_error="unable to allocate output buffer table";
|
||||
return -1;
|
||||
@@ -279,7 +288,7 @@
|
||||
int play(struct audio_play *play)
|
||||
{
|
||||
int err, len;
|
||||
- char *ptr;
|
||||
+ unsigned char *ptr;
|
||||
|
||||
ptr = buf;
|
||||
len = play->nsamples;
|
||||
|
Loading…
Reference in a new issue