wav_player_view.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. }
  89. }
  90. }
  91. return consumed;
  92. }
  93. WavPlayerView* wav_player_view_alloc() {
  94. WavPlayerView* wav_view = malloc(sizeof(WavPlayerView));
  95. wav_view->view = view_alloc();
  96. view_set_context(wav_view->view, wav_view);
  97. view_allocate_model(wav_view->view, ViewModelTypeLocking, sizeof(WavPlayerViewModel));
  98. view_set_draw_callback(wav_view->view, wav_player_view_draw_callback);
  99. view_set_input_callback(wav_view->view, wav_player_view_input_callback);
  100. return wav_view;
  101. }
  102. void wav_player_view_free(WavPlayerView* wav_view) {
  103. furi_assert(wav_view);
  104. view_free(wav_view->view);
  105. free(wav_view);
  106. }
  107. View* wav_player_view_get_view(WavPlayerView* wav_view) {
  108. furi_assert(wav_view);
  109. return wav_view->view;
  110. }
  111. void wav_player_view_set_volume(WavPlayerView* wav_view, float volume) {
  112. furi_assert(wav_view);
  113. with_view_model(wav_view->view, WavPlayerViewModel * model, { model->volume = volume; }, true);
  114. }
  115. void wav_player_view_set_start(WavPlayerView* wav_view, size_t start) {
  116. furi_assert(wav_view);
  117. with_view_model(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(wav_view->view, WavPlayerViewModel * model, { model->end = end; }, true);
  122. }
  123. void wav_player_view_set_current(WavPlayerView* wav_view, size_t current) {
  124. furi_assert(wav_view);
  125. with_view_model(
  126. wav_view->view, WavPlayerViewModel * model, { model->current = current; }, true);
  127. }
  128. void wav_player_view_set_play(WavPlayerView* wav_view, bool play) {
  129. furi_assert(wav_view);
  130. with_view_model(wav_view->view, WavPlayerViewModel * model, { model->play = play; }, true);
  131. }
  132. void wav_player_view_set_chans(WavPlayerView* wav_view, uint16_t chn) {
  133. furi_assert(wav_view);
  134. with_view_model(
  135. wav_view->view, WavPlayerViewModel * model, { model->num_channels = chn; }, true);
  136. }
  137. void wav_player_view_set_bits(WavPlayerView* wav_view, uint16_t bit) {
  138. furi_assert(wav_view);
  139. with_view_model(
  140. wav_view->view, WavPlayerViewModel * model, { model->bits_per_sample = bit; }, true);
  141. }
  142. void wav_player_view_set_data(WavPlayerView* wav_view, uint8_t* data, size_t data_count) {
  143. furi_assert(wav_view);
  144. with_view_model(
  145. wav_view->view,
  146. WavPlayerViewModel * model,
  147. {
  148. size_t inc = (data_count / DATA_COUNT) - 1;
  149. for(size_t i = 0; i < DATA_COUNT; i++) {
  150. model->data[i] = *data / 6;
  151. if(model->data[i] > 42) model->data[i] = 42;
  152. data += inc;
  153. }
  154. },
  155. true);
  156. }
  157. void wav_player_view_set_ctrl_callback(WavPlayerView* wav_view, WavPlayerCtrlCallback callback) {
  158. furi_assert(wav_view);
  159. wav_view->callback = callback;
  160. }
  161. void wav_player_view_set_context(WavPlayerView* wav_view, void* context) {
  162. furi_assert(wav_view);
  163. wav_view->context = context;
  164. }