comparison command.c @ 30082:446f2ea148a4

Return the actually playing audio/video id for get_property, not the one selected e.g. via commandline (which resulted in -1 being returned most of the time).
author reimar
date Sun, 27 Dec 2009 14:13:06 +0000
parents 3cfe91f729d7
children 4752e3cbe7be
comparison
equal deleted inserted replaced
30081:1b18cf7e6abe 30082:446f2ea148a4
793 793
794 /// Selected audio id (RW) 794 /// Selected audio id (RW)
795 static int mp_property_audio(m_option_t * prop, int action, void *arg, 795 static int mp_property_audio(m_option_t * prop, int action, void *arg,
796 MPContext * mpctx) 796 MPContext * mpctx)
797 { 797 {
798 int current_id = -1, tmp; 798 int current_id, tmp;
799 if (!mpctx->demuxer || !mpctx->demuxer->audio) 799 if (!mpctx->demuxer || !mpctx->demuxer->audio)
800 return M_PROPERTY_UNAVAILABLE; 800 return M_PROPERTY_UNAVAILABLE;
801 current_id = mpctx->demuxer->audio->id;
801 802
802 switch (action) { 803 switch (action) {
803 case M_PROPERTY_GET: 804 case M_PROPERTY_GET:
804 if (!arg) 805 if (!arg)
805 return M_PROPERTY_ERROR; 806 return M_PROPERTY_ERROR;
806 *(int *) arg = audio_id; 807 *(int *) arg = current_id;
807 return M_PROPERTY_OK; 808 return M_PROPERTY_OK;
808 case M_PROPERTY_PRINT: 809 case M_PROPERTY_PRINT:
809 if (!arg) 810 if (!arg)
810 return M_PROPERTY_ERROR; 811 return M_PROPERTY_ERROR;
811 812
812 if (audio_id < 0) 813 if (current_id < 0)
813 *(char **) arg = strdup(MSGTR_Disabled); 814 *(char **) arg = strdup(MSGTR_Disabled);
814 else { 815 else {
815 char lang[40] = MSGTR_Unknown; 816 char lang[40] = MSGTR_Unknown;
816 sh_audio_t* sh = mpctx->sh_audio; 817 sh_audio_t* sh = mpctx->sh_audio;
817 if (sh && sh->lang) 818 if (sh && sh->lang)
818 av_strlcpy(lang, sh->lang, 40); 819 av_strlcpy(lang, sh->lang, 40);
819 #ifdef CONFIG_DVDREAD 820 #ifdef CONFIG_DVDREAD
820 else if (mpctx->stream->type == STREAMTYPE_DVD) { 821 else if (mpctx->stream->type == STREAMTYPE_DVD) {
821 int code = dvd_lang_from_aid(mpctx->stream, audio_id); 822 int code = dvd_lang_from_aid(mpctx->stream, current_id);
822 if (code) { 823 if (code) {
823 lang[0] = code >> 8; 824 lang[0] = code >> 8;
824 lang[1] = code; 825 lang[1] = code;
825 lang[2] = 0; 826 lang[2] = 0;
826 } 827 }
827 } 828 }
828 #endif 829 #endif
829 830
830 #ifdef CONFIG_DVDNAV 831 #ifdef CONFIG_DVDNAV
831 else if (mpctx->stream->type == STREAMTYPE_DVDNAV) 832 else if (mpctx->stream->type == STREAMTYPE_DVDNAV)
832 mp_dvdnav_lang_from_aid(mpctx->stream, audio_id, lang); 833 mp_dvdnav_lang_from_aid(mpctx->stream, current_id, lang);
833 #endif 834 #endif
834 *(char **) arg = malloc(64); 835 *(char **) arg = malloc(64);
835 snprintf(*(char **) arg, 64, "(%d) %s", audio_id, lang); 836 snprintf(*(char **) arg, 64, "(%d) %s", current_id, lang);
836 } 837 }
837 return M_PROPERTY_OK; 838 return M_PROPERTY_OK;
838 839
839 case M_PROPERTY_STEP_UP: 840 case M_PROPERTY_STEP_UP:
840 case M_PROPERTY_SET: 841 case M_PROPERTY_SET:
841 if (action == M_PROPERTY_SET && arg) 842 if (action == M_PROPERTY_SET && arg)
842 tmp = *((int *) arg); 843 tmp = *((int *) arg);
843 else 844 else
844 tmp = -1; 845 tmp = -1;
845 current_id = mpctx->demuxer->audio->id;
846 audio_id = demuxer_switch_audio(mpctx->demuxer, tmp); 846 audio_id = demuxer_switch_audio(mpctx->demuxer, tmp);
847 if (audio_id == -2 847 if (audio_id == -2
848 || (audio_id > -1 848 || (audio_id > -1
849 && mpctx->demuxer->audio->id != current_id && current_id != -2)) 849 && mpctx->demuxer->audio->id != current_id && current_id != -2))
850 uninit_player(INITIALIZED_AO | INITIALIZED_ACODEC); 850 uninit_player(INITIALIZED_AO | INITIALIZED_ACODEC);
867 867
868 /// Selected video id (RW) 868 /// Selected video id (RW)
869 static int mp_property_video(m_option_t * prop, int action, void *arg, 869 static int mp_property_video(m_option_t * prop, int action, void *arg,
870 MPContext * mpctx) 870 MPContext * mpctx)
871 { 871 {
872 int current_id = -1, tmp; 872 int current_id, tmp;
873 if (!mpctx->demuxer || !mpctx->demuxer->video) 873 if (!mpctx->demuxer || !mpctx->demuxer->video)
874 return M_PROPERTY_UNAVAILABLE; 874 return M_PROPERTY_UNAVAILABLE;
875 current_id = mpctx->demuxer->video->id;
875 876
876 switch (action) { 877 switch (action) {
877 case M_PROPERTY_GET: 878 case M_PROPERTY_GET:
878 if (!arg) 879 if (!arg)
879 return M_PROPERTY_ERROR; 880 return M_PROPERTY_ERROR;
880 *(int *) arg = video_id; 881 *(int *) arg = current_id;
881 return M_PROPERTY_OK; 882 return M_PROPERTY_OK;
882 case M_PROPERTY_PRINT: 883 case M_PROPERTY_PRINT:
883 if (!arg) 884 if (!arg)
884 return M_PROPERTY_ERROR; 885 return M_PROPERTY_ERROR;
885 886
886 if (video_id < 0) 887 if (current_id < 0)
887 *(char **) arg = strdup(MSGTR_Disabled); 888 *(char **) arg = strdup(MSGTR_Disabled);
888 else { 889 else {
889 char lang[40] = MSGTR_Unknown; 890 char lang[40] = MSGTR_Unknown;
890 *(char **) arg = malloc(64); 891 *(char **) arg = malloc(64);
891 snprintf(*(char **) arg, 64, "(%d) %s", video_id, lang); 892 snprintf(*(char **) arg, 64, "(%d) %s", current_id, lang);
892 } 893 }
893 return M_PROPERTY_OK; 894 return M_PROPERTY_OK;
894 895
895 case M_PROPERTY_STEP_UP: 896 case M_PROPERTY_STEP_UP:
896 case M_PROPERTY_SET: 897 case M_PROPERTY_SET:
897 if (action == M_PROPERTY_SET && arg) 898 if (action == M_PROPERTY_SET && arg)
898 tmp = *((int *) arg); 899 tmp = *((int *) arg);
899 else 900 else
900 tmp = -1; 901 tmp = -1;
901 current_id = mpctx->demuxer->video->id;
902 video_id = demuxer_switch_video(mpctx->demuxer, tmp); 902 video_id = demuxer_switch_video(mpctx->demuxer, tmp);
903 if (video_id == -2 903 if (video_id == -2
904 || (video_id > -1 && mpctx->demuxer->video->id != current_id 904 || (video_id > -1 && mpctx->demuxer->video->id != current_id
905 && current_id != -2)) 905 && current_id != -2))
906 uninit_player(INITIALIZED_VCODEC | 906 uninit_player(INITIALIZED_VCODEC |