init_deinit.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "init_deinit.h"
  2. PlayerView* player_view_alloc(VideoPlayerApp* player) {
  3. PlayerView* player_view = malloc(sizeof(PlayerView));
  4. player_view->view = view_alloc();
  5. player_view->context = player;
  6. view_set_context(player_view->view, player_view);
  7. view_allocate_model(player_view->view, ViewModelTypeLocking, sizeof(PlayerViewModel));
  8. view_set_draw_callback(player_view->view, draw_callback);
  9. view_set_input_callback(player_view->view, input_callback);
  10. return player_view;
  11. }
  12. VideoPlayerApp* init_player() {
  13. VideoPlayerApp* player = malloc(sizeof(VideoPlayerApp));
  14. memset(player, 0, sizeof(VideoPlayerApp));
  15. // Очередь событий на 8 элементов размера VideoPlayerEvent
  16. player->event_queue = furi_message_queue_alloc(8, sizeof(VideoPlayerEvent));
  17. player->gui = furi_record_open(RECORD_GUI);
  18. player->view_dispatcher = view_dispatcher_alloc();
  19. player->player_view = player_view_alloc(player);
  20. view_dispatcher_add_view(player->view_dispatcher, VIEW_PLAYER, player->player_view->view);
  21. view_dispatcher_attach_to_gui(
  22. player->view_dispatcher, player->gui, ViewDispatcherTypeFullscreen);
  23. with_view_model(
  24. player->player_view->view, PlayerViewModel * model, { model->player = player; }, true);
  25. player->storage = furi_record_open(RECORD_STORAGE);
  26. player->stream = file_stream_alloc(player->storage);
  27. player->notification = furi_record_open(RECORD_NOTIFICATION);
  28. notification_message(player->notification, &sequence_display_backlight_enforce_on);
  29. return player;
  30. }
  31. void deinit_player(VideoPlayerApp* player) {
  32. notification_message(player->notification, &sequence_display_backlight_enforce_auto);
  33. furi_record_close(RECORD_NOTIFICATION);
  34. // Специальная очистка памяти, занимаемой очередью
  35. furi_message_queue_free(player->event_queue);
  36. /*view_dispatcher_remove_view(player->view_dispatcher, VIEW_PLAYER);
  37. view_dispatcher_free(player->view_dispatcher);
  38. player_view_free(player->player_view);
  39. furi_record_close(RECORD_GUI);*/
  40. stream_free(player->stream);
  41. furi_record_close(RECORD_STORAGE);
  42. if(player->buffer) {
  43. free(player->buffer);
  44. }
  45. furi_pubsub_unsubscribe(player->input, player->input_subscription);
  46. player->canvas = NULL;
  47. gui_direct_draw_release(player->gui);
  48. furi_record_close(RECORD_GUI);
  49. furi_record_close(RECORD_INPUT_EVENTS);
  50. free(player);
  51. }