diskop.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "diskop.h"
  2. #define CFG_FILENAME "settings.cfg"
  3. void save_instrument_inner(Stream *stream, Instrument *inst)
  4. {
  5. size_t rwops = stream_write(stream, (uint8_t *)inst->name, sizeof(inst->name));
  6. rwops = stream_write(stream, (uint8_t *)&inst->waveform, sizeof(inst->waveform));
  7. rwops = stream_write(stream, (uint8_t *)&inst->flags, sizeof(inst->flags));
  8. rwops = stream_write(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. {
  16. rwops = stream_write(stream, (uint8_t *)&inst->ring_mod, sizeof(inst->ring_mod));
  17. }
  18. if (inst->sound_engine_flags & SE_ENABLE_HARD_SYNC)
  19. {
  20. rwops = stream_write(stream, (uint8_t *)&inst->hard_sync, sizeof(inst->hard_sync));
  21. }
  22. uint8_t progsteps = 0;
  23. for (uint8_t i = 0; i < INST_PROG_LEN; i++)
  24. {
  25. if ((inst->program[i] & 0x7fff) != TE_PROGRAM_NOP)
  26. {
  27. progsteps = i + 1;
  28. }
  29. }
  30. rwops = stream_write(stream, (uint8_t *)&progsteps, sizeof(progsteps));
  31. if (progsteps > 0)
  32. {
  33. rwops = stream_write(stream, (uint8_t *)inst->program, progsteps * sizeof(inst->program[0]));
  34. }
  35. rwops = stream_write(stream, (uint8_t *)&inst->program_period, sizeof(inst->program_period));
  36. if (inst->flags & TE_ENABLE_VIBRATO)
  37. {
  38. rwops = stream_write(stream, (uint8_t *)&inst->vibrato_speed, sizeof(inst->vibrato_speed));
  39. rwops = stream_write(stream, (uint8_t *)&inst->vibrato_depth, sizeof(inst->vibrato_depth));
  40. rwops = stream_write(stream, (uint8_t *)&inst->vibrato_delay, sizeof(inst->vibrato_delay));
  41. }
  42. if (inst->flags & TE_ENABLE_PWM)
  43. {
  44. rwops = stream_write(stream, (uint8_t *)&inst->pwm_speed, sizeof(inst->pwm_speed));
  45. rwops = stream_write(stream, (uint8_t *)&inst->pwm_depth, sizeof(inst->pwm_depth));
  46. rwops = stream_write(stream, (uint8_t *)&inst->pwm_delay, sizeof(inst->pwm_delay));
  47. }
  48. if (inst->sound_engine_flags & SE_ENABLE_FILTER)
  49. {
  50. rwops = stream_write(stream, (uint8_t *)&inst->filter_cutoff, sizeof(inst->filter_cutoff));
  51. rwops = stream_write(stream, (uint8_t *)&inst->filter_resonance, sizeof(inst->filter_resonance));
  52. rwops = stream_write(stream, (uint8_t *)&inst->filter_type, sizeof(inst->filter_type));
  53. }
  54. UNUSED(rwops);
  55. }
  56. bool save_song(FlizzerTrackerApp *tracker, FuriString *filepath)
  57. {
  58. bool file_removed = storage_simply_remove(tracker->storage, furi_string_get_cstr(filepath)); // just in case
  59. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  60. uint8_t version = TRACKER_ENGINE_VERSION;
  61. size_t rwops = stream_write(tracker->stream, (uint8_t *)SONG_FILE_SIG, sizeof(SONG_FILE_SIG) - 1);
  62. rwops = stream_write(tracker->stream, (uint8_t *)&version, sizeof(uint8_t));
  63. TrackerSong *song = &tracker->song;
  64. /*for(uint32_t i = 0; i < 23444; i++)
  65. {
  66. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_end, sizeof(uint8_t));
  67. }*/
  68. rwops = stream_write(tracker->stream, (uint8_t *)song->song_name, sizeof(song->song_name));
  69. rwops = stream_write(tracker->stream, (uint8_t *)&song->loop_start, sizeof(song->loop_start));
  70. rwops = stream_write(tracker->stream, (uint8_t *)&song->loop_end, sizeof(song->loop_end));
  71. rwops = stream_write(tracker->stream, (uint8_t *)&song->pattern_length, sizeof(song->pattern_length));
  72. rwops = stream_write(tracker->stream, (uint8_t *)&song->speed, sizeof(song->speed));
  73. rwops = stream_write(tracker->stream, (uint8_t *)&song->rate, sizeof(song->rate));
  74. rwops = stream_write(tracker->stream, (uint8_t *)&song->num_sequence_steps, sizeof(song->num_sequence_steps));
  75. for (uint16_t i = 0; i < song->num_sequence_steps; i++)
  76. {
  77. rwops = stream_write(tracker->stream, (uint8_t *)&song->sequence.sequence_step[i], sizeof(song->sequence.sequence_step[0]));
  78. }
  79. rwops = stream_write(tracker->stream, (uint8_t *)&song->num_patterns, sizeof(song->num_patterns));
  80. for (uint16_t i = 0; i < song->num_patterns; i++)
  81. {
  82. rwops = stream_write(tracker->stream, (uint8_t *)song->pattern[i].step, sizeof(TrackerSongPatternStep) * (song->pattern_length));
  83. }
  84. rwops = stream_write(tracker->stream, (uint8_t *)&song->num_instruments, sizeof(song->num_instruments));
  85. for (uint16_t i = 0; i < song->num_instruments; i++)
  86. {
  87. save_instrument_inner(tracker->stream, song->instrument[i]);
  88. }
  89. file_stream_close(tracker->stream);
  90. tracker->is_saving = false;
  91. furi_string_free(filepath);
  92. UNUSED(file_removed);
  93. UNUSED(open_file);
  94. UNUSED(rwops);
  95. return false;
  96. }
  97. bool load_song_util(FlizzerTrackerApp *tracker, FuriString *filepath)
  98. {
  99. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  100. bool result = load_song(&tracker->song, tracker->stream);
  101. tracker->is_loading = false;
  102. file_stream_close(tracker->stream);
  103. furi_string_free(filepath);
  104. UNUSED(open_file);
  105. return result;
  106. }
  107. void save_config(FlizzerTrackerApp* tracker)
  108. {
  109. //stream_read_line
  110. FuriString* filepath = furi_string_alloc();
  111. FuriString* config_line = furi_string_alloc();
  112. furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
  113. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  114. UNUSED(open_file);
  115. furi_string_cat_printf(config_line, "%s = %s\n", "external_audio", tracker->external_audio ? "true" : "false");
  116. stream_write_string(tracker->stream, config_line);
  117. file_stream_close(tracker->stream);
  118. furi_string_free(filepath);
  119. furi_string_free(config_line);
  120. }
  121. void load_config(FlizzerTrackerApp* tracker)
  122. {
  123. FuriString* filepath = furi_string_alloc();
  124. FuriString* config_line = furi_string_alloc();
  125. furi_string_cat_printf(filepath, "%s/%s", FLIZZER_TRACKER_FOLDER, CFG_FILENAME);
  126. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  127. UNUSED(open_file);
  128. stream_read_line(tracker->stream, config_line);
  129. sscanf(furi_string_get_cstr(config_line), "%s%s%s", tracker->param, tracker->eq, tracker->value);
  130. if(strcmp(tracker->param, "external_audio") == 0)
  131. {
  132. if(strcmp(tracker->value, "false") == 0)
  133. {
  134. tracker->external_audio = false;
  135. //strcpy(tracker->value, "false_");
  136. }
  137. if(strcmp(tracker->value, "true") == 0)
  138. {
  139. tracker->external_audio = true;
  140. //strcpy(tracker->value, "true_");
  141. }
  142. sound_engine_init(&tracker->sound_engine, tracker->sound_engine.sample_rate, tracker->external_audio, tracker->sound_engine.audio_buffer_size);
  143. //sound_engine_set_audio_output(tracker->external_audio);
  144. }
  145. file_stream_close(tracker->stream);
  146. furi_string_free(filepath);
  147. furi_string_free(config_line);
  148. }