ALSA: add channels and sample_rate private options.
This commit is contained in:
		
							parent
							
								
									003e63b6df
								
							
						
					
					
						commit
						2ea8faf39f
					
				| @ -47,6 +47,7 @@ | |||||||
| 
 | 
 | ||||||
| #include <alsa/asoundlib.h> | #include <alsa/asoundlib.h> | ||||||
| #include "libavformat/avformat.h" | #include "libavformat/avformat.h" | ||||||
|  | #include "libavutil/opt.h" | ||||||
| 
 | 
 | ||||||
| #include "alsa-audio.h" | #include "alsa-audio.h" | ||||||
| 
 | 
 | ||||||
| @ -56,21 +57,14 @@ static av_cold int audio_read_header(AVFormatContext *s1, | |||||||
|     AlsaData *s = s1->priv_data; |     AlsaData *s = s1->priv_data; | ||||||
|     AVStream *st; |     AVStream *st; | ||||||
|     int ret; |     int ret; | ||||||
|     unsigned int sample_rate; |  | ||||||
|     enum CodecID codec_id; |     enum CodecID codec_id; | ||||||
|     snd_pcm_sw_params_t *sw_params; |     snd_pcm_sw_params_t *sw_params; | ||||||
| 
 | 
 | ||||||
|     if (ap->sample_rate <= 0) { |     if (ap->sample_rate > 0) | ||||||
|         av_log(s1, AV_LOG_ERROR, "Bad sample rate %d\n", ap->sample_rate); |         s->sample_rate = ap->sample_rate; | ||||||
| 
 | 
 | ||||||
|         return AVERROR(EIO); |     if (ap->channels > 0) | ||||||
|     } |         s->channels = ap->channels; | ||||||
| 
 |  | ||||||
|     if (ap->channels <= 0) { |  | ||||||
|         av_log(s1, AV_LOG_ERROR, "Bad channels number %d\n", ap->channels); |  | ||||||
| 
 |  | ||||||
|         return AVERROR(EIO); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     st = av_new_stream(s1, 0); |     st = av_new_stream(s1, 0); | ||||||
|     if (!st) { |     if (!st) { | ||||||
| @ -78,10 +72,9 @@ static av_cold int audio_read_header(AVFormatContext *s1, | |||||||
| 
 | 
 | ||||||
|         return AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
|     } |     } | ||||||
|     sample_rate = ap->sample_rate; |  | ||||||
|     codec_id    = s1->audio_codec_id; |     codec_id    = s1->audio_codec_id; | ||||||
| 
 | 
 | ||||||
|     ret = ff_alsa_open(s1, SND_PCM_STREAM_CAPTURE, &sample_rate, ap->channels, |     ret = ff_alsa_open(s1, SND_PCM_STREAM_CAPTURE, &s->sample_rate, s->channels, | ||||||
|         &codec_id); |         &codec_id); | ||||||
|     if (ret < 0) { |     if (ret < 0) { | ||||||
|         return AVERROR(EIO); |         return AVERROR(EIO); | ||||||
| @ -113,8 +106,8 @@ static av_cold int audio_read_header(AVFormatContext *s1, | |||||||
|     /* take real parameters */ |     /* take real parameters */ | ||||||
|     st->codec->codec_type  = AVMEDIA_TYPE_AUDIO; |     st->codec->codec_type  = AVMEDIA_TYPE_AUDIO; | ||||||
|     st->codec->codec_id    = codec_id; |     st->codec->codec_id    = codec_id; | ||||||
|     st->codec->sample_rate = sample_rate; |     st->codec->sample_rate = s->sample_rate; | ||||||
|     st->codec->channels    = ap->channels; |     st->codec->channels    = s->channels; | ||||||
|     av_set_pts_info(st, 64, 1, 1000000);  /* 64 bits pts in us */ |     av_set_pts_info(st, 64, 1, 1000000);  /* 64 bits pts in us */ | ||||||
| 
 | 
 | ||||||
|     return 0; |     return 0; | ||||||
| @ -163,6 +156,19 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static const AVOption options[] = { | ||||||
|  |     { "sample_rate", "", offsetof(AlsaData, sample_rate), FF_OPT_TYPE_INT, {.dbl = 48000}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | ||||||
|  |     { "channels",    "", offsetof(AlsaData, channels),    FF_OPT_TYPE_INT, {.dbl = 2},     1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | ||||||
|  |     { NULL }, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static const AVClass alsa_demuxer_class = { | ||||||
|  |     .class_name     = "ALSA demuxer", | ||||||
|  |     .item_name      = av_default_item_name, | ||||||
|  |     .option         = options, | ||||||
|  |     .version        = LIBAVUTIL_VERSION_INT, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| AVInputFormat ff_alsa_demuxer = { | AVInputFormat ff_alsa_demuxer = { | ||||||
|     "alsa", |     "alsa", | ||||||
|     NULL_IF_CONFIG_SMALL("ALSA audio input"), |     NULL_IF_CONFIG_SMALL("ALSA audio input"), | ||||||
| @ -172,4 +178,5 @@ AVInputFormat ff_alsa_demuxer = { | |||||||
|     audio_read_packet, |     audio_read_packet, | ||||||
|     ff_alsa_close, |     ff_alsa_close, | ||||||
|     .flags = AVFMT_NOFILE, |     .flags = AVFMT_NOFILE, | ||||||
|  |     .priv_class = &alsa_demuxer_class, | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ | |||||||
| #include <alsa/asoundlib.h> | #include <alsa/asoundlib.h> | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include "libavformat/avformat.h" | #include "libavformat/avformat.h" | ||||||
|  | #include "libavutil/log.h" | ||||||
| 
 | 
 | ||||||
| /* XXX: we make the assumption that the soundcard accepts this format */ | /* XXX: we make the assumption that the soundcard accepts this format */ | ||||||
| /* XXX: find better solution with "preinit" method, needed also in
 | /* XXX: find better solution with "preinit" method, needed also in
 | ||||||
| @ -40,9 +41,12 @@ | |||||||
| #define DEFAULT_CODEC_ID AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE) | #define DEFAULT_CODEC_ID AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE) | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  |     AVClass *class; | ||||||
|     snd_pcm_t *h; |     snd_pcm_t *h; | ||||||
|     int frame_size;  ///< preferred size for reads and writes
 |     int frame_size;  ///< preferred size for reads and writes
 | ||||||
|     int period_size; ///< bytes per sample * channels
 |     int period_size; ///< bytes per sample * channels
 | ||||||
|  |     int sample_rate; ///< sample rate set by user
 | ||||||
|  |     int channels;    ///< number of channels set by user
 | ||||||
| } AlsaData; | } AlsaData; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user