diff options
Diffstat (limited to 'audio/gstavdtpsink.c')
| -rw-r--r-- | audio/gstavdtpsink.c | 53 | 
1 files changed, 33 insertions, 20 deletions
| diff --git a/audio/gstavdtpsink.c b/audio/gstavdtpsink.c index c956ecbd..25fc1ced 100644 --- a/audio/gstavdtpsink.c +++ b/audio/gstavdtpsink.c @@ -68,7 +68,7 @@ struct bluetooth_data {  };  #define IS_SBC(n) (strcmp((n), "audio/x-sbc") == 0) -#define IS_MPEG(n) (strcmp((n), "audio/mpeg") == 0) +#define IS_MPEG_AUDIO(n) (strcmp((n), "audio/mpeg") == 0)  enum {  	PROP_0, @@ -87,8 +87,12 @@ static const GstElementDetails avdtp_sink_details =  static GstStaticPadTemplate avdtp_sink_factory =  	GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS,  		GST_STATIC_CAPS("application/x-rtp, " -				"media = (string) \"audio\", " -				"encoding-name = (string) \"SBC\";" +				"media = (string) \"audio\"," +				"payload = (int) " +					GST_RTP_PAYLOAD_DYNAMIC_STRING ", " +				"clock-rate = (int) { 16000, 32000, " +					"44100, 48000 }, " +				"encoding-name = (string) \"SBC\"; "  				"application/x-rtp, "  				"media = (string) \"audio\", "  				"payload = (int) " @@ -231,7 +235,7 @@ static gint gst_avdtp_sink_bluetooth_recvmsg_fd(GstAvdtpSink *sink)  	return 0;  } -static gboolean gst_avdtp_sink_init_pkt_conf(GstAvdtpSink *sink, +static gboolean gst_avdtp_sink_init_sbc_pkt_conf(GstAvdtpSink *sink,  					GstCaps *caps,  					sbc_capabilities_t *pkt)  { @@ -242,9 +246,10 @@ static gboolean gst_avdtp_sink_init_pkt_conf(GstAvdtpSink *sink,  	GstStructure *structure = gst_caps_get_structure(caps, 0);  	name = gst_structure_get_name(structure); -	/* FIXME only sbc supported here, should suport mp3 */ +  	if (!(IS_SBC(name))) { -		GST_ERROR_OBJECT(sink, "Unsupported format %s", name); +		GST_ERROR_OBJECT(sink, "Unexpected format %s, " +				"was expecting sbc", name);  		return FALSE;  	} @@ -814,7 +819,7 @@ static void gst_avdtp_sink_tag(const GstTagList *taglist,  		if (!gst_tag_list_get_boolean(taglist, tag, &crc)) {  			GST_WARNING_OBJECT(self, "failed to get crc tag"); -			self->mpeg_stream_changed = TRUE; +			return;  		}  		gst_avdtp_sink_set_crc(self, crc); @@ -824,7 +829,7 @@ static void gst_avdtp_sink_tag(const GstTagList *taglist,  		if (!gst_tag_list_get_string(taglist, tag, &channel_mode)) {  			GST_WARNING_OBJECT(self,  				"failed to get channel-mode tag"); -			self->mpeg_stream_changed = TRUE; +			return;  		}  		self->channel_mode = gst_avdtp_sink_get_channel_mode( @@ -883,7 +888,6 @@ static gboolean gst_avdtp_sink_start(GstBaseSink *basesink)  	self->stream_caps = NULL;  	self->mp3_using_crc = -1;  	self->channel_mode = -1; -	self->mpeg_stream_changed = FALSE;  	if (!gst_avdtp_sink_get_capabilities(self)) {  		GST_ERROR_OBJECT(self, "failed to get capabilities " @@ -957,8 +961,17 @@ static gboolean gst_avdtp_sink_init_mp3_pkt_conf(  {  	const GValue *value = NULL;  	gint rate, layer; +	const gchar* name;  	GstStructure *structure = gst_caps_get_structure(caps, 0); +	name = gst_structure_get_name(structure); + +	if (!(IS_MPEG_AUDIO(name))) { +		GST_ERROR_OBJECT(self, "Unexpected format %s, " +				"was expecting mp3", name); +		return FALSE; +	} +  	/* layer */  	value = gst_structure_get_value(structure, "layer");  	layer = g_value_get_int(value); @@ -1016,9 +1029,6 @@ static gboolean gst_avdtp_sink_init_mp3_pkt_conf(  	/* vbr - we always say its vbr, we don't have how to know it */  	pkt->bitrate = 0x8000; -	/* bitrate - we don't set anything, its vbr */ -	/* FIXME - is this right? */ -  	return TRUE;  } @@ -1044,7 +1054,7 @@ static gboolean gst_avdtp_sink_configure(GstAvdtpSink *self,  	structure = gst_caps_get_structure(caps, 0);  	if (gst_structure_has_name(structure, "audio/x-sbc")) -		ret = gst_avdtp_sink_init_pkt_conf(self, caps, +		ret = gst_avdtp_sink_init_sbc_pkt_conf(self, caps,  				&req->sbc_capabilities);  	else if (gst_structure_has_name(structure, "audio/mpeg"))  		ret = gst_avdtp_sink_init_mp3_pkt_conf(self, caps, @@ -1188,8 +1198,8 @@ static void gst_avdtp_sink_class_init(GstAvdtpSinkClass *klass)  					"Bluetooth remote device address",  					NULL, G_PARAM_READWRITE)); -	GST_DEBUG_CATEGORY_INIT(avdtp_sink_debug, "a2dpsendersink", 0, -				"A2DP sink element"); +	GST_DEBUG_CATEGORY_INIT(avdtp_sink_debug, "avdtpsink", 0, +				"A2DP headset sink element");  }  static void gst_avdtp_sink_init(GstAvdtpSink *self, @@ -1203,6 +1213,11 @@ static void gst_avdtp_sink_init(GstAvdtpSink *self,  	self->dev_caps = NULL;  	self->sink_lock = g_mutex_new(); + +	/* FIXME this is for not synchronizing with clock, should be tested +	 * with devices to see the behaviour +	gst_base_sink_set_sync(GST_BASE_SINK(self), FALSE); +	*/  }  static GIOError gst_avdtp_sink_audioservice_send( @@ -1325,9 +1340,7 @@ void gst_avdtp_sink_set_crc(GstAvdtpSink *self, gboolean crc)  	/* test if we already received a different crc */  	if (self->mp3_using_crc != -1 && new_crc != self->mp3_using_crc) { -		GST_ERROR_OBJECT(self, "crc changed during stream"); -		/* FIXME test this, its not being used anywhere */ -		self->mpeg_stream_changed = TRUE; +		GST_WARNING_OBJECT(self, "crc changed during stream");  		return;  	}  	self->mp3_using_crc = new_crc; @@ -1342,8 +1355,8 @@ void gst_avdtp_sink_set_channel_mode(GstAvdtpSink *self,  	new_mode = gst_avdtp_sink_get_channel_mode(mode);  	if (self->channel_mode != -1 && new_mode != self->channel_mode) { -		GST_ERROR_OBJECT(self, "channel mode changed during stream"); -		self->mpeg_stream_changed = TRUE; +		GST_WARNING_OBJECT(self, "channel mode changed during stream"); +		return;  	}  	self->channel_mode = new_mode; | 
