| 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 { |