void player_play_file(struct track_info *ti) { player_lock(); __producer_set_file(ti); if (producer_status == PS_UNLOADED) { __consumer_stop(); goto out; } /* PS_STOPPED */ __producer_play(); /* PS_UNLOADED,PS_PLAYING */ if (producer_status == PS_UNLOADED) { __consumer_stop(); goto out; } /* PS_PLAYING */ if (consumer_status == CS_STOPPED) { __consumer_play(); if (consumer_status == CS_STOPPED) __producer_stop(); } else { op_drop(); change_sf(1); } out: __player_status_changed(); if (producer_status == PS_PLAYING) __prebuffer(); player_unlock(); }
static void _consumer_handle_eof(void) { struct track_info *ti; if (ip_is_remote(ip)) { _producer_stop(); _consumer_drain_and_stop(); player_error("lost connection"); return; } if (player_info.ti) player_info.ti->play_count++; if (player_repeat_current) { if (player_cont) { ip_seek(ip, 0); reset_buffer(); } else { _producer_stop(); _consumer_drain_and_stop(); _player_status_changed(); } return; } if (get_next(&ti) == 0) { _producer_unload(); ip = ip_new(ti->filename); _producer_status_update(PS_STOPPED); /* PS_STOPPED, CS_PLAYING */ if (player_cont) { _producer_play(); if (producer_status == PS_UNLOADED) { _consumer_stop(); track_info_unref(ti); file_changed(NULL); } else { /* PS_PLAYING */ file_changed(ti); if (!change_sf(0)) _prebuffer(); } } else { _consumer_drain_and_stop(); file_changed(ti); } } else { _producer_unload(); _consumer_drain_and_stop(); file_changed(NULL); } _player_status_changed(); }