libpurple/media.c

branch
maiku.vv
changeset 26131
5b1937e15c58
parent 26129
18c8f2cfb52b
child 26132
1dce93db50e3
equal deleted inserted replaced
26130:b5e9f243cf89 26131:5b1937e15c58
748 purple_media_got_accept(PurpleMedia *media) 748 purple_media_got_accept(PurpleMedia *media)
749 { 749 {
750 g_signal_emit(media, purple_media_signals[GOT_ACCEPT], 0); 750 g_signal_emit(media, purple_media_signals[GOT_ACCEPT], 0);
751 } 751 }
752 752
753 gchar*
754 purple_media_get_device_name(GstElement *element, const gchar *device)
755 {
756 gchar *name;
757
758 GstElementFactory *factory = gst_element_get_factory(element);
759 GstElement *temp = gst_element_factory_create(factory, "tmp_src");
760
761 g_object_set(G_OBJECT (temp), "device", device, NULL);
762 g_object_get(G_OBJECT (temp), "device-name", &name, NULL);
763 gst_object_unref(temp);
764
765 return name;
766 }
767
768 GList* 753 GList*
769 purple_media_get_devices(GstElement *element) 754 purple_media_get_devices(GstElement *element)
770 { 755 {
771 GObjectClass *klass; 756 GObjectClass *klass;
772 GstPropertyProbe *probe; 757 GstPropertyProbe *probe;
805 790
806 array = gst_property_probe_probe_and_get_values (probe, pspec); 791 array = gst_property_probe_probe_and_get_values (probe, pspec);
807 if (array != NULL) { 792 if (array != NULL) {
808 for (n = 0 ; n < array->n_values ; n++) { 793 for (n = 0 ; n < array->n_values ; n++) {
809 GValue *device = g_value_array_get_nth (array, n); 794 GValue *device = g_value_array_get_nth (array, n);
810 gst_element_set_state (element, GST_STATE_NULL);
811 795
812 ret = g_list_append(ret, g_value_dup_string(device)); 796 ret = g_list_append(ret, g_value_dup_string(device));
813 797
814 name = purple_media_get_device_name(GST_ELEMENT(element), 798 g_object_get(G_OBJECT(element), "device-name", &name, NULL);
815 g_value_get_string(device));
816 purple_debug_info("media", "Found source '%s' (%s) - device '%s' (%s)\n", 799 purple_debug_info("media", "Found source '%s' (%s) - device '%s' (%s)\n",
817 longname, GST_PLUGIN_FEATURE (factory)->name, 800 longname, GST_PLUGIN_FEATURE (factory)->name,
818 name, g_value_get_string(device)); 801 name, g_value_get_string(device));
819 g_free(name); 802 g_free(name);
820 } 803 }
831 } 814 }
832 815
833 return ret; 816 return ret;
834 } 817 }
835 818
836 void
837 purple_media_element_set_device(GstElement *element, const gchar *device)
838 {
839 g_object_set(G_OBJECT(element), "device", device, NULL);
840 }
841
842 gchar * 819 gchar *
843 purple_media_element_get_device(GstElement *element) 820 purple_media_element_get_device(GstElement *element)
844 { 821 {
845 gchar *device; 822 gchar *device;
846 g_object_get(G_OBJECT(element), "device", &device, NULL); 823 g_object_get(G_OBJECT(element), "device", &device, NULL);
847 return device; 824 return device;
848 }
849
850 GstElement *
851 purple_media_get_element(const gchar *factory_name)
852 {
853 GstElementFactory *factory = gst_element_factory_find(factory_name);
854 GstElement *element;
855
856 if (factory == NULL)
857 return NULL;
858
859 element = gst_element_factory_create(factory, NULL);
860 gst_object_unref(factory);
861 return element;
862 } 825 }
863 826
864 void 827 void
865 purple_media_audio_init_src(GstElement **sendbin, GstElement **sendlevel) 828 purple_media_audio_init_src(GstElement **sendbin, GstElement **sendlevel)
866 { 829 {
884 pad = gst_element_get_pad(*sendlevel, "src"); 847 pad = gst_element_get_pad(*sendlevel, "src");
885 ghost = gst_ghost_pad_new("ghostsrc", pad); 848 ghost = gst_ghost_pad_new("ghostsrc", pad);
886 gst_element_add_pad(*sendbin, ghost); 849 gst_element_add_pad(*sendbin, ghost);
887 g_object_set(G_OBJECT(*sendlevel), "message", TRUE, NULL); 850 g_object_set(G_OBJECT(*sendlevel), "message", TRUE, NULL);
888 851
889 /* set current audio device on "src"... */ 852 if (audio_device != NULL && strcmp(audio_device, ""))
890 if (audio_device) { 853 g_object_set(G_OBJECT(src), "device", audio_device, NULL);
891 GList *devices = purple_media_get_devices(src);
892 GList *dev = devices;
893 purple_debug_info("media", "Setting device of GstElement src to %s\n",
894 audio_device);
895 for (; dev ; dev = dev->next) {
896 gchar *device = (gchar *) dev->data;
897 char *name = purple_media_get_device_name(src, device);
898 if (strcmp(name, audio_device) == 0) {
899 purple_media_element_set_device(src, device);
900 }
901 g_free(name);
902 }
903 }
904 } 854 }
905 855
906 void 856 void
907 purple_media_video_init_src(GstElement **sendbin) 857 purple_media_video_init_src(GstElement **sendbin)
908 { 858 {
943 893
944 local_sink = gst_element_factory_make("autovideosink", "purplelocalvideosink"); 894 local_sink = gst_element_factory_make("autovideosink", "purplelocalvideosink");
945 gst_bin_add(GST_BIN(*sendbin), local_sink); 895 gst_bin_add(GST_BIN(*sendbin), local_sink);
946 gst_element_link(queue, local_sink); 896 gst_element_link(queue, local_sink);
947 897
948 /* set current video device on "src"... */ 898 if (video_device != NULL && strcmp(video_device, ""))
949 if (video_device) { 899 g_object_set(G_OBJECT(src), "device", video_device, NULL);
950 GList *devices = purple_media_get_devices(src);
951 GList *dev = devices;
952 purple_debug_info("media", "Setting device of GstElement src to %s\n",
953 video_device);
954 for (; dev ; dev = dev->next) {
955 gchar *device = (gchar *) dev->data;
956 char *name = purple_media_get_device_name(src, device);
957 if (strcmp(name, video_device) == 0) {
958 purple_media_element_set_device(src, device);
959 }
960 g_free(name);
961 }
962 }
963 } 900 }
964 901
965 void 902 void
966 purple_media_audio_init_recv(GstElement **recvbin, GstElement **recvlevel) 903 purple_media_audio_init_recv(GstElement **recvbin, GstElement **recvlevel)
967 { 904 {

mercurial