diskop.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #include "diskop.h"
  2. #define CFG_FILENAME "settings.cfg"
  3. void save_instrument_inner(Stream* stream, Instrument* inst) {
  4. size_t rwops = stream_write(stream, (uint8_t*)inst->name, sizeof(inst->name));
  5. rwops = stream_write(stream, (uint8_t*)&inst->waveform, sizeof(inst->waveform));
  6. rwops = stream_write(stream, (uint8_t*)&inst->flags, sizeof(inst->flags));
  7. rwops = stream_write(
  8. stream, (uint8_t*)&inst->sound_engine_flags, sizeof(inst->sound_engine_flags));
  9. rwops = stream_write(stream, (uint8_t*)&inst->base_note, sizeof(inst->base_note));
  10. rwops = stream_write(stream, (uint8_t*)&inst->finetune, sizeof(inst->finetune));
  11. rwops = stream_write(stream, (uint8_t*)&inst->slide_speed, sizeof(inst->slide_speed));
  12. rwops = stream_write(stream, (uint8_t*)&inst->adsr, sizeof(inst->adsr));
  13. rwops = stream_write(stream, (uint8_t*)&inst->pw, sizeof(inst->pw));
  14. if(inst->sound_engine_flags & SE_ENABLE_RING_MOD) {
  15. rwops = stream_write(stream, (uint8_t*)&inst->ring_mod, sizeof(inst->ring_mod));
  16. }
  17. if(inst->sound_engine_flags & SE_ENABLE_HARD_SYNC) {
  18. rwops = stream_write(stream, (uint8_t*)&inst->hard_sync, sizeof(inst->hard_sync));
  19. }
  20. uint8_t progsteps = 0;
  21. for(uint8_t i = 0; i < INST_PROG_LEN; i++) {
  22. if((inst->program[i] & 0x7fff) != TE_PROGRAM_NOP) {
  23. progsteps = i + 1;
  24. }
  25. }
  26. rwops = stream_write(stream, (uint8_t*)&progsteps, sizeof(progsteps));
  27. if(progsteps > 0) {
  28. rwops =
  29. stream_write(stream, (uint8_t*)inst->program, progsteps * sizeof(inst->program[0]));
  30. }
  31. rwops = stream_write(stream, (uint8_t*)&inst->program_period, sizeof(inst->program_period));
  32. if(inst->flags & TE_ENABLE_VIBRATO) {
  33. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_speed, sizeof(inst->vibrato_speed));
  34. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_depth, sizeof(inst->vibrato_depth));
  35. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_delay, sizeof(inst->vibrato_delay));
  36. }
  37. if(inst->flags & TE_ENABLE_PWM) {
  38. rwops = stream_write(stream, (uint8_t*)&inst->pwm_speed, sizeof(inst->pwm_speed));
  39. rwops = stream_write(stream, (uint8_t*)&inst->pwm_depth, sizeof(inst->pwm_depth));
  40. rwops = stream_write(stream, (uint8_t*)&inst->pwm_delay, sizeof(inst->pwm_delay));
  41. }
  42. if(inst->sound_engine_flags & SE_ENABLE_FILTER) {
  43. rwops = stream_write(stream, (uint8_t*)&inst->filter_cutoff, sizeof(inst->filter_cutoff));
  44. rwops = stream_write(
  45. stream, (uint8_t*)&inst->filter_resonance, sizeof(inst->filter_resonance));
  46. rwops = stream_write(stream, (uint8_t*)&inst->filter_type, sizeof(inst->filter_type));
  47. }
  48. UNUSED(rwops);
  49. }
  50. bool save_instrument(FlizzerTrackerApp* tracker, FuriString* filepath) {
  51. bool file_removed =
  52. storage_simply_remove(tracker->storage, furi_string_get_cstr(filepath)); // just in case
  53. bool open_file = file_stream_open(
  54. tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  55. uint8_t version = TRACKER_ENGINE_VERSION;
  56. size_t rwops =
  57. stream_write(tracker->stream, (uint8_t*)INST_FILE_SIG, sizeof(INST_FILE_SIG) - 1);
  58. rwops = stream_write(tracker->stream, (uint8_t*)&version, sizeof(uint8_t));
  59. Instrument* inst = tracker->song.instrument[tracker->current_instrument];
  60. save_instrument_inner(tracker->stream, inst);
  61. file_stream_close(tracker->stream);
  62. tracker->is_saving_instrument = false;
  63. furi_string_free(filepath);
  64. UNUSED(file_removed);
  65. UNUSED(open_file);
  66. UNUSED(rwops);
  67. return false;
  68. }
  69. bool save_song(FlizzerTrackerApp* tracker, FuriString* filepath) {
  70. bool file_removed =
  71. storage_simply_remove(tracker->storage, furi_string_get_cstr(filepath)); // just in case
  72. bool open_file = file_stream_open(
  73. tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  74. uint8_t version = TRACKER_ENGINE_VERSION;
  75. size_t rwops =
  76. stream_write(tracker->stream, (uint8_t*)SONG_FILE_SIG, sizeof(SONG_FILE_SIG) - 1);
  77. rwops = stream_write(tracker->stream, (uint8_t*)&version, sizeof(uint8_t));
  78. TrackerSong* song = &tracker->song;
  79. /*for(uint32_t i = 0; i < 23444; i++)
  80. {
  81. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_end, sizeof(uint8_t));
  82. }*/
  83. rwops = stream_write(tracker->stream, (uint8_t*)song->song_name, sizeof(song->song_name));
  84. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_start, sizeof(song->loop_start));
  85. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_end, sizeof(song->loop_end));
  86. rwops = stream_write(
  87. tracker->stream, (uint8_t*)&song->pattern_length, sizeof(song->pattern_length));
  88. rwops = stream_write(tracker->stream, (uint8_t*)&song->speed, sizeof(song->speed));
  89. rwops = stream_write(tracker->stream, (uint8_t*)&song->rate, sizeof(song->rate));
  90. rwops = stream_write(
  91. tracker->stream, (uint8_t*)&song->num_sequence_steps, sizeof(song->num_sequence_steps));
  92. for(uint16_t i = 0; i < song->num_sequence_steps; i++) {
  93. rwops = stream_write(
  94. tracker->stream,
  95. (uint8_t*)&song->sequence.sequence_step[i],
  96. sizeof(song->sequence.sequence_step[0]));
  97. }
  98. rwops =
  99. stream_write(tracker->stream, (uint8_t*)&song->num_patterns, sizeof(song->num_patterns));
  100. for(uint16_t i = 0; i < song->num_patterns; i++) {
  101. rwops = stream_write(
  102. tracker->stream,
  103. (uint8_t*)song->pattern[i].step,
  104. sizeof(TrackerSongPatternStep) * (song->pattern_length));
  105. }
  106. rwops = stream_write(
  107. tracker->stream, (uint8_t*)&song->num_instruments, sizeof(song->num_instruments));
  108. for(uint16_t i = 0; i < song->num_instruments; i++) {
  109. save_instrument_inner(tracker->stream, song->instrument[i]);
  110. }
  111. file_stream_close(tracker->stream);
  112. tracker->is_saving = false;
  113. furi_string_free(filepath);
  114. UNUSED(file_removed);
  115. UNUSED(open_file);
  116. UNUSED(rwops);
  117. return false;
  118. }
  119. bool load_song_util(FlizzerTrackerApp* tracker, FuriString* filepath) {
  120. bool open_file = file_stream_open(
  121. tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  122. bool result = load_song(&tracker->song, tracker->stream);
  123. tracker->is_loading = false;
  124. file_stream_close(tracker->stream);
  125. furi_string_free(filepath);
  126. UNUSED(open_file);
  127. return result;
  128. }
  129. bool load_instrument_disk(TrackerSong* song, uint8_t inst, Stream* stream) {
  130. set_default_instrument(song->instrument[inst]);
  131. char header[sizeof(INST_FILE_SIG) + 2] = {0};
  132. size_t rwops = stream_read(stream, (uint8_t*)&header, sizeof(INST_FILE_SIG) - 1);
  133. header[sizeof(INST_FILE_SIG)] = '\0';
  134. uint8_t version = 0;
  135. if(strcmp(header, INST_FILE_SIG) == 0) {
  136. rwops = stream_read(stream, (uint8_t*)&version, sizeof(version));
  137. if(version <= TRACKER_ENGINE_VERSION) {
  138. load_instrument_inner(stream, song->instrument[inst], version);
  139. }
  140. }
  141. UNUSED(rwops);
  142. return false;
  143. }
  144. bool load_instrument_util(FlizzerTrackerApp* tracker, FuriString* filepath) {
  145. bool open_file = file_stream_open(
  146. tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  147. bool result =
  148. load_instrument_disk(&tracker->song, tracker->current_instrument, tracker->stream);
  149. tracker->is_loading_instrument = false;
  150. file_stream_close(tracker->stream);
  151. furi_string_free(filepath);
  152. UNUSED(open_file);
  153. return result;
  154. }
  155. void save_config(FlizzerTrackerApp* tracker) {
  156. // stream_read_line
  157. FuriString* filepath = furi_string_alloc();
  158. FuriString* config_line = furi_string_alloc();
  159. furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
  160. bool open_file = file_stream_open(
  161. tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  162. UNUSED(open_file);
  163. furi_string_cat_printf(
  164. config_line, "%s = %s\n", "external_audio", tracker->external_audio ? "true" : "false");
  165. stream_write_string(tracker->stream, config_line);
  166. file_stream_close(tracker->stream);
  167. furi_string_free(filepath);
  168. furi_string_free(config_line);
  169. }
  170. void load_config(FlizzerTrackerApp* tracker) {
  171. FuriString* filepath = furi_string_alloc();
  172. FuriString* config_line = furi_string_alloc();
  173. furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
  174. bool open_file = file_stream_open(
  175. tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  176. UNUSED(open_file);
  177. stream_read_line(tracker->stream, config_line);
  178. sscanf(
  179. furi_string_get_cstr(config_line), "%s%s%s", tracker->param, tracker->eq, tracker->value);
  180. if(strcmp(tracker->param, "external_audio") == 0) {
  181. if(strcmp(tracker->value, "false") == 0) {
  182. tracker->external_audio = false;
  183. // strcpy(tracker->value, "false_");
  184. }
  185. if(strcmp(tracker->value, "true") == 0) {
  186. tracker->external_audio = true;
  187. // strcpy(tracker->value, "true_");
  188. }
  189. sound_engine_init(
  190. &tracker->sound_engine,
  191. tracker->sound_engine.sample_rate,
  192. tracker->external_audio,
  193. tracker->sound_engine.audio_buffer_size);
  194. // sound_engine_set_audio_output(tracker->external_audio);
  195. }
  196. file_stream_close(tracker->stream);
  197. furi_string_free(filepath);
  198. furi_string_free(config_line);
  199. }