Beispiel #1
0
/*
 * Loads url and starts playback.
 * On success returns 0, on failure -1.
 */
int
player_play(const char *url)
{
	if (state != STOPPED)
		player_stop();
	if (openfile(url) < 0)
		return -1;
	if (openaudio() < 0) {
		closefile();
		return -1;
	}
	flinit();	/* initialize the framelist */

	/*
	 * Create two threads: one for reading and decoding the url,
	 * the other one for cleaning up after the track has finished or
	 * after an abort signal.
	 */
	pthread_create(&decodetid, NULL, decodethread, NULL);
	pthread_create(&watchtid, NULL, watchthread, NULL);
	pthread_detach(watchtid);

	SDL_PauseAudio(0);	/* start playback (1 = Pause, 0 = Play) */
	state = PLAYING;
	return 0;
}
/* --------------------------------------------------------------------------*/
int player_exit(int pid)
{
    int ret = PLAYER_SUCCESS;
    play_para_t *para;

    log_print("[player_exit:enter]pid=%d\n", pid);

    para = player_open_pid_data(pid);
    if (para != NULL) {
        log_print("[player_exit]player_state=0x%x\n", get_player_state(para));
        if (get_player_state(para) != PLAYER_EXIT) {
            player_stop(pid);
        }

        ret = player_thread_wait_exit(para);
        log_print("[player_exit]player thread already exit: %d\n", ret);
        ffmpeg_uninterrupt(para->thread_mgt.pthread_id);
        FREE(para);
        para = NULL;
    }
    player_close_pid_data(pid);
    player_release_pid(pid);
    log_print("[player_exit:exit]pid=%d\n", pid);

    return ret;
}
Beispiel #3
0
/*
 * Class:     com_farcore_playerservice_MediaPlayer
 * Method:    stop
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_farcore_playerservice_AmPlayer_stop
  (JNIEnv *env, jobject obj, jint pid){
    int ret = -1; 
    LOGI("player stop");
    ret =player_stop(pid);
    return ret;
}
Beispiel #4
0
void player_pause(void)
{
	if (ip && ip_is_remote(ip) && consumer_status == CS_PLAYING) {
		/* pausing not allowed */
		player_stop();
		return;
	}
	player_lock();

	if (consumer_status == CS_STOPPED) {
		_producer_play();
		if (producer_status == PS_PLAYING) {
			_consumer_play();
			if (consumer_status != CS_PLAYING)
				_producer_stop();
		}
		_player_status_changed();
		if (consumer_status == CS_PLAYING)
			_prebuffer();
		player_unlock();
		return;
	}

	_producer_pause();
	_consumer_pause();
	_player_status_changed();
	player_unlock();
}
Beispiel #5
0
static int player_close(MSFilter *f, void *arg){
	PlayerData *d=(PlayerData*)f->data;
	player_stop(f,NULL);
	if (d->fd>=0)	close(d->fd);
	d->fd=-1;
	d->state=CLOSED;
	return 0;
}
Beispiel #6
0
static void Done(tta* p)
{
	free(p->Buffer);
	p->Buffer = NULL;

  close_tta_file(&p->Decoder);
  player_stop();
}
Beispiel #7
0
static void
tta_free (DB_fileinfo_t *_info) {
    tta_info_t *info = (tta_info_t *)_info;
    if (info) {
        player_stop (&info->tta);
        close_tta_file (&info->tta);
        free (info);
    }
}
Beispiel #8
0
void
player_exit(void)
{
	if (state != STOPPED)
		player_stop();

	avformat_network_deinit();
	SDL_Quit();
}
gboolean
player_set_file (Player     *player,
		 const char *file,
		 char      **error)
{
	GstElementState new_state;

	g_return_val_if_fail (IS_PLAYER (player), FALSE);

	*error = NULL;

	if (player->priv->eos_idle_id > 0) {
		g_source_remove (player->priv->eos_idle_id);
		player->priv->eos_idle_id = 0;
	}

	if (!file) {
		player_stop (player);

		return FALSE;
	}

	switch (gst_element_get_state (GST_ELEMENT (player->priv->play))) {
	case GST_STATE_PLAYING:
		new_state = GST_STATE_PLAYING;
		player_stop (player);
		break;

	default:
		new_state = GST_STATE_READY;
		break;
	}

	g_free (player->priv->current_file);
	player->priv->current_file = g_strdup (file);

	gst_play_set_location (player->priv->play, file);

	gst_element_set_state (GST_ELEMENT (player->priv->play), new_state);

	player->priv->pos = 0;

	return TRUE;
}
Beispiel #10
0
static void *rtsp_conversation_thread_func(void *pconn) {
    // SIGUSR1 is used to interrupt this thread if blocked for read
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGUSR1);
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);

    rtsp_conn_info *conn = pconn;

    rtsp_message *req, *resp;
    char *hdr, *auth_nonce = NULL;
    while ((req = rtsp_read_request(conn->fd))) {
        resp = msg_init();
        resp->respcode = 400;

        apple_challenge(conn->fd, req, resp);
        hdr = msg_get_header(req, "CSeq");
        if (hdr)
            msg_add_header(resp, "CSeq", hdr);
        msg_add_header(resp, "Audio-Jack-Status", "connected; type=analog");

        if (rtsp_auth(&auth_nonce, req, resp))
            goto respond;

        struct method_handler *mh;
        for (mh=method_handlers; mh->method; mh++) {
            if (!strcmp(mh->method, req->method)) {
                mh->handler(conn, req, resp);
                break;
            }
        }

respond:
        msg_write_response(conn->fd, resp);
        msg_free(req);
        msg_free(resp);
    }

    debug(1, "closing RTSP connection\n");
    if (conn->fd > 0)
        close(conn->fd);
    if (rtsp_playing()) {
        rtp_shutdown();
        debug(1, "stop player\n");
        player_stop();
        debug(1, "player stoped\n");
        please_shutdown = 0;
        pthread_mutex_unlock(&playing_mutex);
    }
    if (auth_nonce)
        free(auth_nonce);
    conn->running = 0;
    debug(2, "terminating RTSP thread\n");
    return NULL;
}
Beispiel #11
0
void rtsp_shutdown_stream(void) {     // printf("enter %s\n",__FUNCTION__);

	CloseAllSocket();
   if (rtsp_playing()) 
   {
        rtp_shutdown();
        player_stop();
        please_shutdown = 1;
        pthread_mutex_unlock(&playing_mutex);
    }

}
static void
player_finalize (GObject *object)
{
	Player *player = PLAYER (object);

	player_stop (player);

	g_free (player->priv);

	if (G_OBJECT_CLASS (parent_class)->finalize)
		(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
Beispiel #13
0
int
cmd_reload(int argc, char *argv[])
{
    char *db_file;
    char *playlist_dir;

    if (argc != 2) {
        paint_error("usage: %s [ db | conf ]", argv[0]);
        return 1;
    }

    /* reload database or config file */
    if (strcasecmp(argv[1], "db") == 0) {

        db_file = strdup(mdb.db_file);
        playlist_dir = strdup(mdb.playlist_dir);
        if (db_file == NULL || playlist_dir == NULL)
            err(1, "cmd_reload: strdup(3) failed");

        /* stop playback TODO investigate a nice way around this */
        player_stop();

        /* reload db */
        medialib_destroy();
        medialib_load(db_file, playlist_dir);

        /* sort entries */
        qsort(mdb.library->files, mdb.library->nfiles, sizeof(meta_info*), mi_compare);

        free(db_file);
        free(playlist_dir);

        /* re-setup ui basics */
        playing_playlist = NULL;
        setup_viewing_playlist(mdb.library);
        ui.library->voffset = 0;
        ui.library->nrows = mdb.nplaylists;
        ui.library->crow = 0;
        paint_all();

    } else if (strcasecmp(argv[1], "conf") == 0) {
        load_config();
        paint_message("configuration reloaded");
    } else {
        paint_error("usage: %s [ db | conf ]", argv[0]);
        return 2;
    }

    return 0;
}
Beispiel #14
0
static void* music_player_thread (thread_handler* h)
{
    music_player* mp = (music_player*) h;

    while(!h->cancel) {
	int song;
	if (0 > read (mp->control[0], &song, sizeof(song)))
	    break;

	player_stop(mp);
	if (song >= 0)
	    player_start(mp, mp->songs[song]);
    }
    return NULL;
}
Beispiel #15
0
/**
 * 停止TTA音乐文件的播放,销毁所占有的线程、资源等
 *
 * @note 不可以在播放线程中调用,必须能够多次重复调用而不死机
 *
 * @return 成功时返回0
 */
static int tta_end(void)
{
	__end();

	xAudioEnd();

	if (g_buff != NULL) {
		free(g_buff);
		g_buff = NULL;
	}

	player_stop();
	close_tta_file(&ttainfo);
	g_status = ST_STOPPED;
	generic_end();

	return 0;
}
static void
error_cb (GObject   *object,
	  GstObject *origin,
	  char      *error,
	  Player    *player)
{
	PlayerError *data = g_new0 (PlayerError, 1);

	/* Stop playing so we don't get repeated error messages. Might lead to
	 * troubles with threads, not sure.
	 */
	player_stop (player);

	data->player = player;
	data->error = g_strdup (error);

	g_idle_add ((GSourceFunc) error_idle_cb, data);
}
Beispiel #17
0
void	aff_text(t_data *data, t_bunny_picture *text)
{
  int	i;
  t_bunny_position	pos;

  pos.x = data->player.x - 100;
  pos.y = data->player.y - 350;
  i = 0;
  while (i < 250)
    {
      aff_map(data);
      player_stop(data);
      (data->inv.open == 1 ? aff_inventory(data) : (void)0);
      bunny_blit(&data->win->buffer, text, &pos);
      bunny_display(data->win);
      my_sleep(200);
      i++;
    }
}
Beispiel #18
0
void	launch_turtle_end(t_data *data)
{
  int	nbr;

  nbr = 0;
  data->cupa_end = 1;
  while (data->inv.turtle_pos.x != 1024)
    {
      data->inv.turtle_pos.x++;
      (data->map.pos_calq1.y > (322 - 272) ? data->map.pos_calq1.y-- : 0);
      (data->map.pos_calq2.y < (655 - 272)  ? data->map.pos_calq2.y++ : 0);
      if (nbr == 0)
	{
	  player_stop(data);
	  aff_map(data);
	  (data->inv.open == 1 ? aff_inventory(data) : (void)0);
	  bunny_blit(wb, data->inv.item_min[0].item, &data->inv.turtle_pos);
	  bunny_blit(wb, data->map.calq1, &data->map.pos_calq1);
	  bunny_blit(wb, data->map.calq2, &data->map.pos_calq2);
	  bunny_display(data->win);
	}
      (nbr == 2 ? nbr = 0 : nbr++);
    }
}
Beispiel #19
0
Datei: main.c Projekt: jgmp/8play
/*
 * Non-blocking getchar
 * Returns the character if one is available, else it returns -1.
 */
static int
nbgetchar(void)
{
	struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
	fd_set fds;
	int nr;

	FD_ZERO(&fds);
	FD_SET(STDIN_FILENO, &fds);
	select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);
	if (FD_ISSET(STDIN_FILENO, &fds))
		nr = getchar();
	else
		nr = -1;
	return nr;
}

static void
play(const char *url, int cflag)
{
	struct mix *mix = NULL;
	char *playtoken;
	int mixid;

	settermios();
	player_init();

	playtoken = getplaytoken();
	if (playtoken == NULL) {
		printf("Could not get a playtoken\n");
		goto end;
	}

	mix = mix_getbyurl(url);
	if (mix == NULL) {
		printf("Mix not found.\n");
		goto end;
	}
start:
	printf("%s by %s\n", mix->name, mix->user);
	playmix(mix->id, playtoken);

	if (cflag && !quitflag) {
		mixid = mix->id;
		mix_free(mix);
		mix = mix_getbysimilar(mixid, playtoken);
		if (mix == NULL)
			printf("Could not get the next mix.\n");
		else
			goto start;
	}
 end:
	mix_free(mix);
	free(playtoken);
	player_exit();
	resettermios();
}

static void
playmix(int mixid, const char *playtoken)
{
	struct track *track;
	int cmd, i;

	track = track_getfirst(mixid, playtoken);
	if (track == NULL) {
		printf("Could not load the playlist.\n");
		return;
	}
	for (i = 1; track != NULL; ++i) {
		printf("%02d. %s - %s\n", i, track->performer, track->name);
		cmd = playtrack(mixid, track, playtoken);
		track_free(track);
		if (quitflag)
			break;
		if (cmd == NEXT)
			track = track_getnext(mixid, playtoken);
		else if (cmd == SKIP)
			track = track_getskip(mixid, playtoken);
		else if (cmd == SKIPMIX)
			break;
	}
}

/*
 * Playtrack plays the track and checks for user input.  It returns a
 * suggestion on what to do next.  It can return NEXT to suggest that the track
 * has finished without user interruption and it is ready for the next track,
 * or it can return SKIP or SKIPMIX.
 */
static int
playtrack(int mixid, struct track *track, const char *playtoken)
{
	struct timespec tm = { .tv_sec = 0, .tv_nsec = 50000000 };
	int ch, cmd = NEXT, reportflag = 0;

	player_play(track->url);
	while (player_getstatus() != STOPPED) {
		if (quitflag) {
			player_stop();
			goto end;
		}
		printtime();
		ch = nbgetchar();
		switch (ch) {
		case 'q':
			printf("Quitting...\n");
			player_stop();
			quitflag = 1;
			goto end;
		case '\n':
		case '\r':
			printf("Skipping...\n");
			if (!track->skipallowedflag) {
				printf("Skip not allowed.\n");
			} else {
				player_stop();
				cmd = SKIP;
				goto end;
			}
			break;
		case '>':
			printf("Skipping mix...\n");
			player_stop();
			cmd = SKIPMIX;
			goto end;
		case 'p':
		case ' ':
			player_togglepause();
			break;
		default:
			break;
		}
		if (!reportflag && player_getposition() > 30) {
			report(track->id, mixid, playtoken);
			reportflag = 1;
		}
		nanosleep(&tm, NULL);
	}
end:
	return cmd;
}

static void
printshortmix(struct mix *mix)
{
	printf("%s\n", mix->url + 1);	/* skip first character */
	printf("\t%s\n", mix->tags);
	if (mix->certification != NULL)
		printf("\tcert: %s\n", mix->certification);
	if (mix->duration < 0) {
		printf("\tplays: %d\tlikes: %d\t(%d tracks)\n",
		    mix->playscount, mix->likescount, mix->trackscount);
	} else {
		printf("\tplays: %d\t likes: %d\t%d min (%d tracks)\n",
		    mix->playscount, mix->likescount, mix->duration / 60,
		    mix->trackscount);
	}
}

static void
query(const char *url)
{
	struct mix *mix;

	mix = mix_getbyurl(url);
	if (mix == NULL) {
		printf("Mix not found.\n");
		goto end;
	}
	printf("Mix name:\t%s ", mix->name);
	printf("(id: %d)\n", mix->id);
	printf("Created by:\t%s ", mix->user);
	printf("(id: %d)\n", mix->userid);
	printf("Description:\n%s\n", mix->description);
	printf("Tags:\t%s\n", mix->tags);
	if (mix->certification)
		printf("Certification:\t%s\n", mix->certification);
	printf("Plays: %d\t likes: %d\t%d min (%d tracks)\n",
	    mix->playscount, mix->likescount, mix->duration / 60,
	    mix->trackscount);
end:
	mix_free(mix);
}

static void
printtime(void)
{
	int duration, position;

	if (player_getstatus() == PAUSED) {
		printf("(paused)       \r");
	} else {
		duration = player_getduration();
		position = player_getposition();
		printf("%02d:%02d/%02d:%02d\r",
		    position / 60, position % 60,
		    duration / 60, duration % 60);
	}
	fflush(stdout);
}
Beispiel #20
0
static void
action_stop (AGlActor* button, gpointer _)
{
	player_stop();
}
Beispiel #21
0
/* this is called for each file to process */
enum codec_status codec_run(void)
{
    tta_info info;
    unsigned int decodedsamples;
    int endofstream;
    int new_pos = 0;
    int sample_count;
    intptr_t param;
  
    if (codec_init())
    {
        DEBUGF("codec_init() error\n");
        return CODEC_ERROR;
    }

    ci->seek_buffer(0);

    if (set_tta_info(&info) < 0 || player_init(&info) < 0)
        return CODEC_ERROR;

    codec_set_replaygain(ci->id3);

    ci->configure(DSP_SWITCH_FREQUENCY, ci->id3->frequency);
    if (info.NCH == 2) {
        ci->configure(DSP_SET_STEREO_MODE, STEREO_INTERLEAVED);
    } else if (info.NCH == 1) {
        ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO);
    } else {
        DEBUGF("CODEC_ERROR: more than 2 channels\n");
        player_stop();
        return CODEC_ERROR;
    }

    /* The main decoder loop */
    decodedsamples = 0;
    endofstream = 0;

    if (ci->id3->offset > 0)
    {
        /* Need to save offset for later use (cleared indirectly by advance_buffer) */
        new_pos = set_position(ci->id3->offset, TTA_SEEK_POS);
        if (new_pos >= 0)
            decodedsamples = new_pos;
    }

    ci->set_elapsed((uint64_t)info.LENGTH * 1000 * decodedsamples / info.DATALENGTH);

    while (!endofstream)
    {
        enum codec_command_action action = ci->get_command(&param);

        if (action == CODEC_ACTION_HALT)
            break;

        if (action == CODEC_ACTION_SEEK_TIME)
        {
            new_pos = set_position(param / SEEK_STEP, TTA_SEEK_TIME);
            if (new_pos >= 0)
            {
                decodedsamples = new_pos;
            }

            ci->set_elapsed((uint64_t)info.LENGTH * 1000 * decodedsamples / info.DATALENGTH);
            ci->seek_complete();
        }

        sample_count = get_samples(samples);
        if (sample_count < 0)
            break;
 
        ci->pcmbuf_insert(samples, NULL, sample_count);
        decodedsamples += sample_count;
        if (decodedsamples >= info.DATALENGTH)
            endofstream = 1;
        ci->set_elapsed((uint64_t)info.LENGTH * 1000 * decodedsamples / info.DATALENGTH);
    }

    player_stop();
    return CODEC_OK;
}
Beispiel #22
0
/* this is the codec entry point */
enum codec_status codec_main(void)
{
    tta_info info;
    int status;
    unsigned int decodedsamples;
    int endofstream;
    int new_pos = 0;
    int sample_count;

    /* Generic codec initialisation */
    ci->configure(DSP_SET_SAMPLE_DEPTH, TTA_OUTPUT_DEPTH - 1);
  
next_track:
    status = CODEC_OK;

    if (codec_init())
    {
        DEBUGF("codec_init() error\n");
        status = CODEC_ERROR;
        goto exit;
    }

    if (codec_wait_taginfo() != 0)
        goto done;

    if (set_tta_info(&info) < 0 || player_init(&info) < 0)
    {
        status = CODEC_ERROR;
        goto exit;
    }

    codec_set_replaygain(ci->id3);

    ci->configure(DSP_SWITCH_FREQUENCY, ci->id3->frequency);
    if (info.NCH == 2) {
        ci->configure(DSP_SET_STEREO_MODE, STEREO_INTERLEAVED);
    } else if (info.NCH == 1) {
        ci->configure(DSP_SET_STEREO_MODE, STEREO_MONO);
    } else {
        DEBUGF("CODEC_ERROR: more than 2 channels\n");
        status = CODEC_ERROR;
        goto done;
    }

    /* The main decoder loop */
    decodedsamples = 0;
    endofstream = 0;

    if (ci->id3->offset > 0)
    {
        /* Need to save offset for later use (cleared indirectly by advance_buffer) */
        new_pos = set_position(ci->id3->offset, TTA_SEEK_POS);
        if (new_pos >= 0)
            decodedsamples = new_pos;
        ci->seek_complete();
    }

    while (!endofstream)
    {
        ci->yield();
        if (ci->stop_codec || ci->new_track)
            break;

        if (ci->seek_time)
        {
            new_pos = set_position(ci->seek_time / SEEK_STEP, TTA_SEEK_TIME);
            if (new_pos >= 0)
            {
                decodedsamples = new_pos;
                ci->seek_complete();
            }
        }

        sample_count = get_samples(samples);
        if (sample_count < 0)
        {
            status = CODEC_ERROR;
            break;
        }
        ci->pcmbuf_insert(samples, NULL, sample_count);
        decodedsamples += sample_count;
        if (decodedsamples >= info.DATALENGTH)
            endofstream = 1;
        ci->set_elapsed((uint64_t)info.LENGTH * 1000 * decodedsamples / info.DATALENGTH);
    }

done:
    player_stop();
    if (ci->request_next_track())
        goto next_track;

exit:
    return status;
}
Beispiel #23
0
static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
    if (event->type == RTGUI_EVENT_PAINT)
    {
        struct rtgui_dc* dc;
        struct rtgui_rect rect;
        rtgui_image_t *background;

		/* draw child */
		rtgui_view_event_handler(widget, event);

        dc = rtgui_dc_begin_drawing(widget);
        if (dc == RT_NULL) return RT_FALSE;
        rtgui_widget_get_rect(widget, &rect);

        /* draw background */
        background = rtgui_image_create_from_file("hdc", "/resource/bg.hdc", RT_FALSE);
        if (background != RT_NULL)
        {
            rtgui_image_blit(background, dc, &rect);
            rtgui_image_destroy(background);
        }
        else
        {
            rtgui_dc_fill_rect(dc, &rect);
        }

        /* draw playing information */
		player_update_tag_info();

        rtgui_dc_end_drawing(dc);

        return RT_FALSE;
    }
    else if (event->type == RTGUI_EVENT_KBD)
    {
        struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
        if (ekbd->type == RTGUI_KEYDOWN)
        {
        	if ((ekbd->key == RTGUIK_LEFT) || (ekbd->key == RTGUIK_RIGHT))
        	{
        		if (player_mode == PLAYER_STOP)
        		{
                    rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE);
        		}
        		else
        		{
        			rt_device_t dev = rt_device_find("snd");
        			if (ekbd->key == RTGUIK_LEFT && radio_setup.default_volume > 0)
        			{
        				radio_setup.default_volume--;
        				rt_device_control(dev, CODEC_CMD_VOLUME, &radio_setup.default_volume);
        			}
        			else if (ekbd->key == RTGUIK_RIGHT && radio_setup.default_volume < CODEC_VOLUME_MAX)
        			{
        				radio_setup.default_volume++;
        				rt_device_control(dev, CODEC_CMD_VOLUME, &radio_setup.default_volume);
        			}
        		}
        	}
			else
			{
				return RTGUI_WIDGET(music_listbox)->event_handler(RTGUI_WIDGET(music_listbox), event);
			}
        }
        return RT_FALSE;
    }
	else if (event->type == RTGUI_EVENT_MOUSE_BUTTON)
	{
		struct rtgui_event_mouse* emouse;

		emouse = (struct rtgui_event_mouse*)event;
		if (emouse->button & RTGUI_MOUSE_BUTTON_UP)
		{
			if (rtgui_rect_contains_point(&next_btn_rect, emouse->x, emouse->y) == RT_EOK)
				player_onbutton(NEXT_BUTTON);
			else if (rtgui_rect_contains_point(&prev_btn_rect, emouse->x, emouse->y) == RT_EOK)
				player_onbutton(PREV_BUTTON);
			else if (rtgui_rect_contains_point(&playing_btn_rect, emouse->x, emouse->y) == RT_EOK)
				player_onbutton(PLAYING_BUTTON);
		}
	}
    else if (event->type == RTGUI_EVENT_COMMAND)
    {
        struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;

        switch (ecmd->command_id)
        {
        case PLAYER_REQUEST_PLAY_SINGLE_FILE:
        case PLAYER_REQUEST_PLAY_LIST:
            rtgui_timer_start(info_timer);
			return RT_TRUE;

        case PLAYER_REQUEST_STOP:
        {
			struct play_item *item = RT_NULL;

			/* if it's radio mode, set next mode to stop */
			if (player_mode == PLAYER_PLAY_RADIO)
				next_step = PLAYER_STEP_STOP;

			/* set player mode */
			player_mode = PLAYER_STOP;

			switch (next_step)
			{
			case PLAYER_STEP_NEXT:
				/* play next */
				item = play_list_next(play_list_get_mode());
				break;
			case PLAYER_STEP_PREV:
				/* play prev */
				item = play_list_prev(play_list_get_mode());
				break;
			case PLAYER_STEP_SEEK:
				/* play current item */
				item = play_list_current();
			}

			if (item != RT_NULL)
				player_play_item(item);
			else
			{
				player_mode = PLAYER_STOP;
				rtgui_timer_stop(info_timer);
			}

			/* update tag information */
			player_update_tag_info();
        }
		return RT_TRUE;

        case PLAYER_REQUEST_FREEZE:
        {
            /* stop play */
            if (player_is_playing() == RT_TRUE)
            {
                player_stop();
            }

            /* delay some tick */
            rt_thread_delay(50);

            /* show a modal view */
            {
                rtgui_view_t *view;
                rtgui_label_t *label;
                rtgui_rect_t rect = {0, 0, 150, 150}, container_rect;

                rtgui_graphic_driver_get_default_rect(&container_rect);
                /* set centre */
                rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
                view = rtgui_view_create("USB");
                rtgui_workbench_add_view(workbench, view);

                /* set container to window rect */
                container_rect = rect;

                rect.x1 = 0;
                rect.y1 = 0;
                rect.x2 = 120;
                rect.y2 = 20;
                label = rtgui_label_create("USB 联机中...");
                rtgui_rect_moveto_align(&container_rect, &rect, RTGUI_ALIGN_CENTER_HORIZONTAL | RTGUI_ALIGN_CENTER_VERTICAL);
                rtgui_widget_set_rect(RTGUI_WIDGET(label), &rect);
                rtgui_container_add_child(RTGUI_CONTAINER(view), RTGUI_WIDGET(label));

                rtgui_view_show(view, RT_TRUE);
                /* never reach hear */
            }
        }

		case PLAYER_REQUEST_UPDATE_INFO:
			/* update status information */
			player_update_tag_info();
			return RT_TRUE;

        default:
            break;
        }

        return RT_FALSE;
    }

    return rtgui_view_event_handler(widget, event);
}
Beispiel #24
0
SoundPlayer::~SoundPlayer() {
	player_stop();
	pthread_mutex_destroy(&player_mutex);
	pthread_mutex_destroy(&control_mutex);
}
int main(int argc,char *argv[])
{
	play_control_t *pCtrl = NULL;	
	int pid;
	int pos = 0;
	int speed = 0;
	int tmpneedexit = 0;
	int ret = -1;
	media_info_t minfo;	
	char tmpcommand[TMP_COMMAND_MAX];
	EMU_STEP tmpstep = EMU_STEP_MENU; 
	
	pCtrl = (play_control_t*)malloc(sizeof(play_control_t));  
	memset(pCtrl,0,sizeof(play_control_t)); 	
	memset(&minfo,0,sizeof(media_info_t));
	if(argc<2)
	{
		printf("usage:player file\n");
		return -1;
	}
	player_init();		
	set_display_axis(0);		//move osd out of screen to set video layer out
		
	player_register_update_callback(&pCtrl->callback_fn,&update_player_info,1000);
	printf("player callback register....\n");
	
	pCtrl->file_name = strdup(argv[1]);
	
	//pCtrl->nosound = 1;   // if disable audio...,must call this api
	pCtrl->video_index = -1;// MUST
	pCtrl->audio_index = -1;// MUST
    pCtrl->sub_index = -1;/// MUST 
    pCtrl->hassub = 1;  // enable subtitle

	//just open a buffer,just for p2p,http,etc...
    //pCtrl->auto_buffing_enable = 1;
//	pCtrl->buffing_min = 0.001;
//	pCtrl->buffing_middle = 0.02;
//	pCtrl->buffing_max = 0.9;
	
	pCtrl->t_pos = -1;	// start position, if live streaming, need set to -1
	pCtrl->need_start = 0; // if 0,you can omit player_start_play API.just play video/audio immediately. if 1,need call "player_start_play" API;
	
	pid=player_start(pCtrl,0);
	if(pid<0)
	{
		printf("player start failed!error=%d\n",pid);
		return -1;
	}	
	signal(SIGSEGV, signal_handler);
    //SYS_disable_osd0();	
	while((!tmpneedexit)&&(!PLAYER_THREAD_IS_STOPPED(player_get_state(pid)))){
		 switch (tmpstep) {                
    		case EMU_STEP_PAUSE:   
				player_pause(pid);                
				tmpstep = EMU_STEP_MENU;
    			break;
    		case EMU_STEP_RESUME:
                player_resume(pid);
                tmpstep = EMU_STEP_MENU;    				
    			break;
    		case EMU_STEP_SEEK:   
    			printf("will  seek position:100\n");
    			pos = 100;    			
    			player_timesearch(pid,pos);
    			tmpstep = EMU_STEP_MENU;    		
    			break;    		
    		 		
    			break;
    		case EMU_STEP_STOP:
                player_stop(pid);				
                tmpstep = EMU_STEP_MENU;    			
    			break; 
    		case EMU_STEP_FF:
    			printf("please input fastforward speed:\n");
    			speed = 1;    			
    			player_forward(pid,speed);
    			tmpstep = EMU_STEP_MENU;    		
    			break;
    		case EMU_STEP_RR:
    			printf("please input fastrewind speed:");
    			speed = 1;    			
    			player_backward(pid,speed);
    			tmpstep = EMU_STEP_MENU; 
    			break;  
    		case EMU_STEP_SETLOOP:
    			player_loop(pid);
    			tmpstep = EMU_STEP_MENU;    			
    			break;  
    		case EMU_STEP_EXIT:
    			player_exit(pid);
    			tmpneedexit = 1;
    			break;    
			case EMU_STEP_START:
				player_start_play(pid);
				//SYS_set_tsync_enable(0);///< f no sound,can set to be 0
				tmpstep = EMU_STEP_MENU; 		
				break;
			case EMU_STEP_GETAVMEDIAINFO:
				if(pid>=0){
					if(player_get_state(pid) > PLAYER_INITOK) {
						ret = player_get_media_info(pid,&minfo);
						if(ret==0)
							_media_info_dump(&minfo);					
					}
				}
				tmpstep = EMU_STEP_MENU; 	
				break;	
			case EMU_STEP_MENU:
				do {
					printf(SCREEN_SPLITER);
					printf("       	     player benchmark tool for android            v2.0\n");
					printf(SCREEN_SPLITER);
					printf("* Please choose one option                                 *\r\n");	
					printf("* 0   show main menu                                       *\r\n");	
					printf("* a   start play                                           *\r\n");	
					printf("* s   get media info                                       *\r\n");				
					printf("* 1   Pause play                                           *\r\n");
					printf("* 2   Resume play                                          *\r\n");
					printf("* 3   Stop play                                            *\r\n");			   
					printf("* 4   Fastforward                                          *\r\n");  
					printf("* 5   Fastrewind                                       	   *\r\n");  
					printf("* 6   Seek                                             	   *\r\n"); 
					printf("* 7   Set repeat                                           *\r\n"); 	                  
					printf("* 8   Quit tools                                           *\r\n");  					
					printf(SCREEN_SPLITER); 
					printf("please input you choice:");
					memset(tmpcommand,0,TMP_COMMAND_MAX);
					
					scanf ("%s",tmpcommand);				    
				    if (strcmp(tmpcommand,"1")==0){
				        tmpstep = EMU_STEP_PAUSE;
				    } 
				    if (strcmp(tmpcommand,"0")==0){
				    	sleep(1);
				        tmpstep = EMU_STEP_MENU;
				    }
				    else if (strcmp(tmpcommand,"2")==0){
				    	tmpstep = EMU_STEP_RESUME;
				    } 
				    else if (strcmp(tmpcommand,"3")==0){
				    	tmpstep = EMU_STEP_STOP;
				    }                     
				    else if (strcmp(tmpcommand,"4")==0){
				        tmpstep = EMU_STEP_FF;
				    } 
				    else if (strcmp(tmpcommand,"5")==0){
				        tmpstep = EMU_STEP_RR;
				    } 
				    else if (strcmp(tmpcommand,"6")==0) {
				        tmpstep = EMU_STEP_SEEK;
				    } 
				    else if (strcmp(tmpcommand,"7")==0) {
				        tmpstep = EMU_STEP_SETLOOP;
				    } 
				    else if (strcmp(tmpcommand,"8")==0) {
				    	
				        tmpstep = EMU_STEP_EXIT;
				    }
					else if (strcmp(tmpcommand,"a")==0) {
				        tmpstep = EMU_STEP_START;
				    }
				    else if (strcmp(tmpcommand,"s")==0){
				    	tmpstep = EMU_STEP_GETAVMEDIAINFO;
				    }
				    
				}while (0);
				
				break;
    	}	
		usleep(100*1000);
        signal(SIGCHLD, SIG_IGN);        
		signal(SIGTSTP, SIG_IGN);        
		signal(SIGTTOU, SIG_IGN);        
		signal(SIGTTIN, SIG_IGN);        
		signal(SIGHUP, signal_handler);        
		signal(SIGTERM, signal_handler);        
		signal(SIGSEGV, signal_handler);        
		signal(SIGINT, signal_handler);        
		signal(SIGQUIT, signal_handler);		
	}	
	set_display_axis(1);	//recover osd
	free(pCtrl->file_name);
	free(pCtrl);       
    printf("...........player exit,~,byeybe...........\n");	
	return 0;
}
Beispiel #26
0
/* the menu logic for the ncurses interface, much simpler than it looks...
 */
void ninterface()
{
	menu_parameters artists_menu, albums_menu, tracks_menu;

	char *sections[] = {"Artists", "Albums", "Tracks" };  /* Section titles, used in the menu */

	artist art;
	album alb;
	track song;
	list np;

	int art_choice, alb_choice, trak_choice;

	/* ---===[ ARTISTS MENU ]===--- */
	artists_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str));
	artists_menu->list = get_artist_list();
	artists_menu->list_len = num_artists;
	artists_menu->title = "Artists:";
	artists_menu->sections = sections;
	artists_menu->num_sections = 3;
	artists_menu->curr_section = 1;
	artists_menu->commands = COMMANDS;
	artists_menu->select = 0;
	artists_menu->scroll = 0;
	artists_menu->height = LINES;
	artists_menu->width = COLS;

	while(1) {
		art_choice = nmenu(artists_menu);  /* draw artist menu */
		artists_menu->select = art_choice;

		if(artists_menu->entered == QUIT_BACK)  /* exit artist menu (and function) */
			break;
		else if(artists_menu->entered == APPEND_PLAYLIST || artists_menu->entered == REPLACE_PLAYLIST) {  /* play an artist (XMMS2) */
			if(artists_menu->entered == REPLACE_PLAYLIST) {
				player_stop();
				player_clear_playlist();
			}

			art = ((artist)(lookup(artists_menu->list[art_choice])->contents));

			player_add_artist(art);

			player_play();
		} else if(artists_menu->entered == TOGGLE_PLAY_PAUSE) {
			player_toggle();
		} else if(artists_menu->entered == NOWPLAYING) {
			now_playing();
		} else if(artists_menu->entered == NEXT) {
			player_next();
		} else if(artists_menu->entered == PREVIOUS) {
			player_previous();
		}

		/* ---===[ ALBUMS MENU ]===--- */
		else if(artists_menu->entered == '\n') { /* enter this menu */
			art = ((artist)(lookup(artists_menu->list[art_choice])->contents));

			albums_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str));
			albums_menu->list = get_album_list(art);
			albums_menu->list_len = art->num_albums;
			albums_menu->title = art->name;
			albums_menu->sections = sections;
			albums_menu->num_sections = 3;
			albums_menu->curr_section = 2;
			albums_menu->commands = COMMANDS;
			albums_menu->select = 0;
			albums_menu->scroll = 0;
			albums_menu->height = LINES;
			albums_menu->width = COLS;

			while(1) {
				alb_choice = nmenu(albums_menu);  /* draw album menu */

				if(albums_menu->entered == KEY_LEFT || albums_menu->entered == QUIT_BACK) /* exit albums menu */
					break;
				else if(albums_menu->entered == APPEND_PLAYLIST || albums_menu->entered == REPLACE_PLAYLIST)  {  /* play an album (XMMS2) */
					if(albums_menu->entered == REPLACE_PLAYLIST) {
						player_stop();
						player_clear_playlist();
					}


					for(np = art->albums; np != NULL; np = np->next)
						if(strcmp(albums_menu->list[alb_choice], np->name) == 0)
							break;

					alb = (album)np->contents;


					player_add_album(alb);
					player_play();
				} else if(albums_menu->entered == TOGGLE_PLAY_PAUSE) {
					player_toggle();
				} else if(albums_menu->entered == NOWPLAYING) {
					now_playing();
				} else if(albums_menu->entered == NEXT) {
					player_next();
				} else if(albums_menu->entered == PREVIOUS) {
					player_previous();
				}

				/* ---===[ TRACKS MENU ]===--- */
				else if(albums_menu->entered == '\n') { /* enter this menu */
					for(np = art->albums; np != NULL; np = np->next)
						if(strcmp(albums_menu->list[alb_choice], np->name) == 0)
							break;

					alb = (album)np->contents;

					tracks_menu = (menu_parameters)malloc(sizeof(struct menu_parameters_str));
					tracks_menu->list = get_track_list(alb);
					tracks_menu->list_len = alb->num_songs;
					tracks_menu->title = alb->name;
					tracks_menu->sections = sections;
					tracks_menu->num_sections = 3;
					tracks_menu->curr_section = 3;
					tracks_menu->commands = COMMANDS;
					tracks_menu->select = 0;
					tracks_menu->scroll = 0;
					tracks_menu->height = LINES;
					tracks_menu->width = COLS;

					while(1) {
						trak_choice = nmenu(tracks_menu);  /* draw track menu */

						/* play a track (XMMS2) */
						if(tracks_menu->entered == APPEND_PLAYLIST || tracks_menu->entered == REPLACE_PLAYLIST) {  /* play a track (XMMS2) */
							if(tracks_menu->entered == REPLACE_PLAYLIST) {
								player_stop();
								player_clear_playlist();
							}

							for(song = alb->songs; song != NULL; song = song->next)
								if(strcmp(tracks_menu->list[trak_choice], song->name) == 0)
									break;

							player_add_track(song);
							player_play();
						} else if(tracks_menu->entered == TOGGLE_PLAY_PAUSE) {
							player_toggle();
						} else if(tracks_menu->entered == NOWPLAYING) {
							now_playing();
						} else if(tracks_menu->entered == KEY_LEFT || tracks_menu->entered == QUIT_BACK) { /* exit tracks menu */
							break;
						} else if(tracks_menu->entered == NEXT) {
							player_next();
						} else if(tracks_menu->entered == PREVIOUS) {
							player_previous();
						}
					} /* drop out of tracks here */

					destroy_menu_params(tracks_menu);
				}
			} /* drop out of albums here */

			destroy_menu_params(albums_menu);
		 }
	} /* drop out of artists here */

	destroy_menu_params(artists_menu);

	return;
}
Beispiel #27
0
void on_stop_activate(GtkAction * action, gpointer user_data)
{
    player_stop(get_player(app));
}
JNIEXPORT jint JNICALL Java_com_chris_yanlong_PlayerView_player_1stop
(JNIEnv *env, jobject obj, jint handle ){

	player_stop((int)handle);
}
Beispiel #29
0
static void function_filelist(struct rtgui_widget* widget, void* parameter)
{
    rtgui_rect_t rect;
    rtgui_filelist_view_t *view;

    rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect);
    view = rtgui_filelist_view_create(workbench, "/SD", "*.*", &rect);
    if (view != RT_NULL)
    {
        if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK)
        {
        	int type;
            char fn[64];

            /* get file */
			rtgui_filelist_view_get_fullpath(view, fn, sizeof(fn));
			type = media_type(fn);

			/* stop playing */
			player_stop();

			/* check whether it's a folder */
			if (is_directory(fn) == RT_TRUE)
			{
				play_list_append_directory(fn);
                if (play_list_items() > 0)
                {
                    player_play_item(play_list_start());
                }
			}
            else if (type == MEDIA_WAV || type == MEDIA_MP3)
            {
                /* clear old play list */
                play_list_clear();
				/* append file */
                play_list_append(fn);

				player_play_item(play_list_start());
            }
            else if (type == MEDIA_M3U)
            {
            	/* append m3u filelist */
            	play_list_append_m3u(fn);
                if (play_list_items() > 0)
                {
                    player_play_item(play_list_start());
                }
            }

			player_update_list();
        }

        /* destroy view */
        rtgui_filelist_view_destroy(view);
    }

	/* show home view */
	rtgui_view_show(home_view, RT_FALSE);

    return;
}