wav_player_view.c 6.5 KB

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