wav_player_view.c 6.9 KB

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