wav_player_view.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include "wav_player_view.h"
  2. float map(float x, float in_min, float in_max, float out_min, float out_max) {
  3. return (x - in_min) * (out_max - out_min + 1) / (in_max - in_min + 1) + out_min;
  4. }
  5. static void wav_player_view_draw_callback(Canvas* canvas, void* _model) {
  6. WavPlayerViewModel* model = _model;
  7. canvas_clear(canvas);
  8. canvas_set_color(canvas, ColorBlack);
  9. uint8_t x_pos = 0;
  10. uint8_t y_pos = 0;
  11. // volume
  12. x_pos = 123;
  13. y_pos = 0;
  14. const float volume = (64 / 10.0f) * model->volume;
  15. canvas_draw_frame(canvas, x_pos, y_pos, 4, 64);
  16. canvas_draw_box(canvas, x_pos, y_pos + (64 - volume), 4, volume);
  17. // play / pause
  18. x_pos = 58;
  19. y_pos = 55;
  20. if(!model->play) {
  21. canvas_draw_line(canvas, x_pos, y_pos, x_pos + 8, y_pos + 4);
  22. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos + 8, y_pos + 4);
  23. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos, y_pos);
  24. } else {
  25. canvas_draw_box(canvas, x_pos, y_pos, 3, 9);
  26. canvas_draw_box(canvas, x_pos + 4, y_pos, 3, 9);
  27. }
  28. x_pos = 78;
  29. y_pos = 55;
  30. canvas_draw_line(canvas, x_pos, y_pos, x_pos + 4, y_pos + 4);
  31. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos + 4, y_pos + 4);
  32. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos, y_pos);
  33. x_pos = 82;
  34. y_pos = 55;
  35. canvas_draw_line(canvas, x_pos, y_pos, x_pos + 4, y_pos + 4);
  36. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos + 4, y_pos + 4);
  37. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos, y_pos);
  38. x_pos = 40;
  39. y_pos = 55;
  40. canvas_draw_line(canvas, x_pos, y_pos, x_pos - 4, y_pos + 4);
  41. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos - 4, y_pos + 4);
  42. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos, y_pos);
  43. x_pos = 44;
  44. y_pos = 55;
  45. canvas_draw_line(canvas, x_pos, y_pos, x_pos - 4, y_pos + 4);
  46. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos - 4, y_pos + 4);
  47. canvas_draw_line(canvas, x_pos, y_pos + 8, x_pos, y_pos);
  48. // len
  49. x_pos = 4;
  50. y_pos = 47;
  51. const uint8_t play_len = 116;
  52. uint8_t play_pos = map(model->current, model->start, model->end, 0, play_len - 4);
  53. canvas_draw_frame(canvas, x_pos, y_pos, play_len, 4);
  54. canvas_draw_box(canvas, x_pos + play_pos, y_pos - 2, 4, 8);
  55. canvas_draw_box(canvas, x_pos, y_pos, play_pos, 4);
  56. // osc
  57. x_pos = 4;
  58. y_pos = 0;
  59. for(size_t i = 1; i < DATA_COUNT; i++) {
  60. canvas_draw_line(canvas, x_pos + i - 1, model->data[i - 1], x_pos + i, model->data[i]);
  61. }
  62. }
  63. static bool wav_player_view_input_callback(InputEvent* event, void* context) {
  64. WavPlayerView* wav_player_view = context;
  65. bool consumed = false;
  66. if(wav_player_view->callback) {
  67. if(event->type == InputTypeShort || event->type == InputTypeRepeat) {
  68. if(event->key == InputKeyUp) {
  69. wav_player_view->callback(WavPlayerCtrlVolUp, wav_player_view->context);
  70. consumed = true;
  71. } else if(event->key == InputKeyDown) {
  72. wav_player_view->callback(WavPlayerCtrlVolDn, wav_player_view->context);
  73. consumed = true;
  74. } else if(event->key == InputKeyLeft) {
  75. wav_player_view->callback(WavPlayerCtrlMoveL, wav_player_view->context);
  76. consumed = true;
  77. } else if(event->key == InputKeyRight) {
  78. wav_player_view->callback(WavPlayerCtrlMoveR, wav_player_view->context);
  79. consumed = true;
  80. } else if(event->key == InputKeyOk) {
  81. wav_player_view->callback(WavPlayerCtrlOk, wav_player_view->context);
  82. consumed = true;
  83. } else if(event->key == InputKeyBack) {
  84. wav_player_view->callback(WavPlayerCtrlBack, wav_player_view->context);
  85. consumed = true;
  86. }
  87. }
  88. }
  89. return consumed;
  90. }
  91. WavPlayerView* wav_player_view_alloc() {
  92. WavPlayerView* wav_view = malloc(sizeof(WavPlayerView));
  93. wav_view->view = view_alloc();
  94. view_set_context(wav_view->view, wav_view);
  95. view_allocate_model(wav_view->view, ViewModelTypeLocking, sizeof(WavPlayerViewModel));
  96. view_set_draw_callback(wav_view->view, wav_player_view_draw_callback);
  97. view_set_input_callback(wav_view->view, wav_player_view_input_callback);
  98. return wav_view;
  99. }
  100. void wav_player_view_free(WavPlayerView* wav_view) {
  101. furi_assert(wav_view);
  102. view_free(wav_view->view);
  103. free(wav_view);
  104. }
  105. View* wav_player_view_get_view(WavPlayerView* wav_view) {
  106. furi_assert(wav_view);
  107. return wav_view->view;
  108. }
  109. void wav_player_view_set_volume(WavPlayerView* wav_view, float volume) {
  110. furi_assert(wav_view);
  111. with_view_model(
  112. wav_view->view, WavPlayerViewModel * model, { model->volume = volume; }, true);
  113. }
  114. void wav_player_view_set_start(WavPlayerView* wav_view, size_t start) {
  115. furi_assert(wav_view);
  116. with_view_model(
  117. wav_view->view, WavPlayerViewModel * model, { model->start = start; }, true);
  118. }
  119. void wav_player_view_set_end(WavPlayerView* wav_view, size_t end) {
  120. furi_assert(wav_view);
  121. with_view_model(
  122. wav_view->view, WavPlayerViewModel * model, { model->end = end; }, true);
  123. }
  124. void wav_player_view_set_current(WavPlayerView* wav_view, size_t current) {
  125. furi_assert(wav_view);
  126. with_view_model(
  127. wav_view->view, WavPlayerViewModel * model, { model->current = current; }, true);
  128. }
  129. void wav_player_view_set_play(WavPlayerView* wav_view, bool play) {
  130. furi_assert(wav_view);
  131. with_view_model(
  132. wav_view->view, WavPlayerViewModel * model, { model->play = play; }, true);
  133. }
  134. void wav_player_view_set_data(WavPlayerView* wav_view, uint16_t* data, size_t data_count) {
  135. furi_assert(wav_view);
  136. with_view_model(
  137. wav_view->view,
  138. WavPlayerViewModel * model,
  139. {
  140. size_t inc = (data_count / DATA_COUNT) - 1;
  141. for(size_t i = 0; i < DATA_COUNT; i++) {
  142. model->data[i] = *data / 6;
  143. if(model->data[i] > 42) model->data[i] = 42;
  144. data += inc;
  145. }
  146. },
  147. true);
  148. }
  149. void wav_player_view_set_ctrl_callback(WavPlayerView* wav_view, WavPlayerCtrlCallback callback) {
  150. furi_assert(wav_view);
  151. wav_view->callback = callback;
  152. }
  153. void wav_player_view_set_context(WavPlayerView* wav_view, void* context) {
  154. furi_assert(wav_view);
  155. wav_view->context = context;
  156. }