1674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann/* 2674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 3674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 59184e2eeb7b97371c6b83b747c8984e2340d2b47Marcel Holtmann * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 6674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 7674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 8674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * This library is free software; you can redistribute it and/or 9674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * modify it under the terms of the GNU Lesser General Public 10674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * License as published by the Free Software Foundation; either 11674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * version 2.1 of the License, or (at your option) any later version. 12674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 13674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * This library is distributed in the hope that it will be useful, 14674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 15674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * Lesser General Public License for more details. 17674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 18674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * You should have received a copy of the GNU Lesser General Public 19674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * License along with this library; if not, write to the Free Software 20674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann * 22674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann */ 23674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann 24674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann#ifdef HAVE_CONFIG_H 25674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann#include <config.h> 26674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann#endif 27674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann 28a8b3b548ec9870df10709a839ed4c07e6d8eb76dLuiz Augusto von Dentz#include <string.h> 29a8b3b548ec9870df10709a839ed4c07e6d8eb76dLuiz Augusto von Dentz 30595a975c95033e68e23727d96425fb92adf63bc1Marcel Holtmann#include <gst/gst.h> 31595a975c95033e68e23727d96425fb92adf63bc1Marcel Holtmann 32de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz#include "gstsbcutil.h" 33de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz#include <sbc.h> 34de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz 350a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann#include "gstsbcenc.h" 360a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann#include "gstsbcdec.h" 377e8ae7f5bd23a425674180df138d3dcc3b21afb6Marcel Holtmann#include "gstsbcparse.h" 38e8e68d294cd662970de6082473e30ecd6ee8dd61Luiz Augusto von Dentz#include "gstavdtpsink.h" 3973b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann#include "gsta2dpsink.h" 40a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz#include "gstrtpsbcpay.h" 41674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann 42a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmannstatic GstStaticCaps sbc_caps = GST_STATIC_CAPS("audio/x-sbc"); 43a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 44a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann#define SBC_CAPS (gst_static_caps_get(&sbc_caps)) 45a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 46a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmannstatic void sbc_typefind(GstTypeFind *tf, gpointer ignore) 47a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann{ 48de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz GstCaps *caps; 49de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz guint8 *aux; 50de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz sbc_t sbc; 51de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz guint8 *data = gst_type_find_peek(tf, 0, 32); 52de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz 535eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen if (data == NULL) 54de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz return; 55a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 565eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen if (sbc_init(&sbc, 0) < 0) 57a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann return; 58a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 59de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz aux = g_new(guint8, 32); 60de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz memcpy(aux, data, 32); 615eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen if (sbc_parse(&sbc, aux, 32) < 0) 625eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen goto done; 63de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz 645eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen caps = gst_sbc_parse_caps_from_sbc(&sbc); 65de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz gst_type_find_suggest(tf, GST_TYPE_FIND_POSSIBLE, caps); 66de8b4e7ab91bad2c1c6e796f53d4e69ecbadd0bdLuiz Augusto von Dentz gst_caps_unref(caps); 675eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen 685eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonendone: 695eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen g_free(aux); 705eed41df3e9554e27756f796bc45635d78ca63a8Harri Mahonen sbc_finish(&sbc); 71a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann} 72a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 73a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmannstatic gchar *sbc_exts[] = { "sbc", NULL }; 74a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 75674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmannstatic gboolean plugin_init(GstPlugin *plugin) 76674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann{ 7773b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann GST_INFO("Bluetooth plugin %s", VERSION); 7873b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann 79a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann if (gst_type_find_register(plugin, "sbc", 80a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann GST_RANK_PRIMARY, sbc_typefind, sbc_exts, 81a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann SBC_CAPS, NULL, NULL) == FALSE) 82a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann return FALSE; 83a889dc322a49c0bf8f8b77389cfbaa97703e828eMarcel Holtmann 84a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz if (!gst_sbc_enc_plugin_init(plugin)) 850a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann return FALSE; 860a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann 87a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz if (!gst_sbc_dec_plugin_init(plugin)) 880a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann return FALSE; 890a527f667ae62ac335f22d1d053179b20ff26e94Marcel Holtmann 90a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz if (!gst_sbc_parse_plugin_init(plugin)) 917e8ae7f5bd23a425674180df138d3dcc3b21afb6Marcel Holtmann return FALSE; 927e8ae7f5bd23a425674180df138d3dcc3b21afb6Marcel Holtmann 93e8e68d294cd662970de6082473e30ecd6ee8dd61Luiz Augusto von Dentz if (!gst_avdtp_sink_plugin_init(plugin)) 94a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz return FALSE; 95a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz 96a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz if (!gst_a2dp_sink_plugin_init(plugin)) 97a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz return FALSE; 98a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz 99a0af7ee44534dad8f35a4142c6a22177e54ffc57Luiz Augusto von Dentz if (!gst_rtp_sbc_pay_plugin_init(plugin)) 10073b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann return FALSE; 10173b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann 102674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann return TRUE; 103674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann} 104674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann 10592bd92f8514ee69f464e965ec465adb86ff882b9Marcel Holtmannextern GstPluginDesc gst_plugin_desc __attribute__ ((visibility("default"))); 10692bd92f8514ee69f464e965ec465adb86ff882b9Marcel Holtmann 107674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel HoltmannGST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, 108674a1d6355ebd5c1e9ffc2e7663b747f60ac70b5Marcel Holtmann "bluetooth", "Bluetooth plugin library", 10973b35c403df78c10e03ded497fcb16fcb23b822eMarcel Holtmann plugin_init, VERSION, "LGPL", "BlueZ", "http://www.bluez.org/") 110