TEG_STATUS turno_2prevplayer( PSPLAYER *ppJ ) { PSPLAYER pJ; PLIST_ENTRY first_node = (PLIST_ENTRY)*ppJ; PLIST_ENTRY l = LIST_PREV( (*ppJ)); TURNO_DEBUG("Old turn: '%s'\n",(*ppJ)->name); g_game.old_turn = *ppJ; if( IsListEmpty( first_node ) ) return TEG_STATUS_ERROR; while( l != first_node ) { pJ = (PSPLAYER) l; if( (l != &g_list_player) && player_is_playing(pJ) ) { (*ppJ) = pJ; TURNO_DEBUG("New turn: '%s'\n",pJ->name); return TEG_STATUS_SUCCESS; } l = LIST_PREV(l); } con_text_out_wop(M_ERR,"Abnormal error in turno_2prevplayer\n"); return TEG_STATUS_PLAYERNOTFOUND; }
void wav(const char* filename) { extern rt_uint32_t current_offset; int fd; rt_err_t result; WAVEFORMATEX winfo; char buff[60]; s_BuffIndex = 0; fd = open(filename, O_RDONLY, 0); if (fd >= 0) { rt_size_t len; result = rt_sem_init(&s_semForPlay, "semforplay", 1, RT_IPC_FLAG_FIFO); if (result != RT_EOK) { rt_kprintf(" semaphore: semforplay init failed./r/n"); rt_sem_detach(&s_semForPlay);/* 脱离信号量对象 */ } len = read(fd, (char*)buff, 0x2c); if (strncmp("WAVEfmt", (char *)buff + 8, 7) != 0 ) {//非wav格式咱不理他 rt_kprintf("format is not support !\n\r"); close(fd); return; } memset(&winfo, 0, sizeof(winfo)); //从音频数据的起始抓取 信息,用于播放波特率设置等 winfo.wFormatTag = 0x01; //表示pcm编码 winfo.nChannels = *(rt_uint16_t *)(buff+0x16); winfo.nSamplesPerSec = *(rt_uint32_t *)(buff+0x18); winfo.nAvgBytesPerSec = *(rt_uint32_t *)(buff+0x1c); winfo.nBlockAlign = *(rt_uint16_t *)(buff+0x20); winfo.wBitsPerSample = *(rt_uint16_t *)(buff+0x22); winfo.cbSize = *(rt_uint32_t *)(buff+0x28); rt_kprintf("\nSample Rate = %d, Channels = %d, BitsPerSample = %d, file size = %dM Bytes\n", winfo.nSamplesPerSec, winfo.nChannels, winfo.wBitsPerSample, winfo.cbSize/1024/1024); if (winfo.wBitsPerSample!=16)//2byte { rt_kprintf("8bit format is not support !\n\r"); close(fd); return; } current_offset = 0; len = read(fd, (char *)(&BufData[s_BuffIndex][0]), (2048*2)); IIS_Config(winfo.nSamplesPerSec, (u32)(&BufData[0][0]), (2048)); do { if (player_is_playing() != RT_TRUE) { break; } result = rt_sem_take(&s_semForPlay, RT_WAITING_FOREVER); if (result != RT_EOK) { rt_kprintf(" semaphore: semforplay init failed./r/n"); rt_sem_detach(&s_semForPlay);/* 脱离信号量对象 */ } DMA_Transmit((u32)((&BufData[s_BuffIndex][0])), (2048)); if (++s_BuffIndex>=2) s_BuffIndex = 0; len = read(fd, (char *)(&BufData[s_BuffIndex][0]), (2048*2)); if (len != (2048*2)) { rt_kprintf("file read fail or there is no more data!\n\r"); close(fd); return; } current_offset+=len; if (player_get_mode() != PLAYER_PLAY_RADIO) player_set_position(current_offset); } while (len != 0); close(fd); } }
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); }