diskop.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #include "diskop.h"
  2. void save_instrument_inner(Stream* stream, Instrument* inst)
  3. {
  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(stream, (uint8_t*)&inst->sound_engine_flags, sizeof(inst->sound_engine_flags));
  8. rwops = stream_write(stream, (uint8_t*)&inst->base_note, sizeof(inst->base_note));
  9. rwops = stream_write(stream, (uint8_t*)&inst->finetune, sizeof(inst->finetune));
  10. rwops = stream_write(stream, (uint8_t*)&inst->slide_speed, sizeof(inst->slide_speed));
  11. rwops = stream_write(stream, (uint8_t*)&inst->adsr, sizeof(inst->adsr));
  12. rwops = stream_write(stream, (uint8_t*)&inst->pw, sizeof(inst->pw));
  13. if(inst->sound_engine_flags & SE_ENABLE_RING_MOD)
  14. {
  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. {
  19. rwops = stream_write(stream, (uint8_t*)&inst->hard_sync, sizeof(inst->hard_sync));
  20. }
  21. uint8_t progsteps = 0;
  22. for(uint8_t i = 0; i < INST_PROG_LEN; i++)
  23. {
  24. if((inst->program[i] & 0x7fff) != TE_PROGRAM_NOP)
  25. {
  26. progsteps = i + 1;
  27. }
  28. }
  29. rwops = stream_write(stream, (uint8_t*)&progsteps, sizeof(progsteps));
  30. if(progsteps > 0)
  31. {
  32. rwops = stream_write(stream, (uint8_t*)inst->program, progsteps * sizeof(inst->program[0]));
  33. }
  34. rwops = stream_write(stream, (uint8_t*)&inst->program_period, sizeof(inst->program_period));
  35. if(inst->flags & TE_ENABLE_VIBRATO)
  36. {
  37. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_speed, sizeof(inst->vibrato_speed));
  38. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_depth, sizeof(inst->vibrato_depth));
  39. rwops = stream_write(stream, (uint8_t*)&inst->vibrato_delay, sizeof(inst->vibrato_delay));
  40. }
  41. if(inst->flags & TE_ENABLE_PWM)
  42. {
  43. rwops = stream_write(stream, (uint8_t*)&inst->pwm_speed, sizeof(inst->pwm_speed));
  44. rwops = stream_write(stream, (uint8_t*)&inst->pwm_depth, sizeof(inst->pwm_depth));
  45. rwops = stream_write(stream, (uint8_t*)&inst->pwm_delay, sizeof(inst->pwm_delay));
  46. }
  47. if(inst->sound_engine_flags & SE_ENABLE_FILTER)
  48. {
  49. rwops = stream_write(stream, (uint8_t*)&inst->filter_cutoff, sizeof(inst->filter_cutoff));
  50. rwops = stream_write(stream, (uint8_t*)&inst->filter_resonance, sizeof(inst->filter_resonance));
  51. rwops = stream_write(stream, (uint8_t*)&inst->filter_type, sizeof(inst->filter_type));
  52. }
  53. UNUSED(rwops);
  54. }
  55. bool save_song(FlizzerTrackerApp* tracker, FuriString* filepath)
  56. {
  57. bool file_removed = storage_simply_remove(tracker->storage, furi_string_get_cstr(filepath)); //just in case
  58. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_WRITE, FSOM_OPEN_ALWAYS);
  59. uint8_t version = TRACKER_ENGINE_VERSION;
  60. size_t rwops = stream_write(tracker->stream, (uint8_t*)SONG_FILE_SIG, sizeof(SONG_FILE_SIG) - 1);
  61. rwops = stream_write(tracker->stream, (uint8_t*)&version, sizeof(uint8_t));
  62. TrackerSong* song = &tracker->song;
  63. /*for(uint32_t i = 0; i < 23444; i++)
  64. {
  65. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_end, sizeof(uint8_t));
  66. }*/
  67. rwops = stream_write(tracker->stream, (uint8_t*)song->song_name, sizeof(song->song_name));
  68. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_start, sizeof(song->loop_start));
  69. rwops = stream_write(tracker->stream, (uint8_t*)&song->loop_end, sizeof(song->loop_end));
  70. rwops = stream_write(tracker->stream, (uint8_t*)&song->pattern_length, sizeof(song->pattern_length));
  71. rwops = stream_write(tracker->stream, (uint8_t*)&song->speed, sizeof(song->speed));
  72. rwops = stream_write(tracker->stream, (uint8_t*)&song->rate, sizeof(song->rate));
  73. rwops = stream_write(tracker->stream, (uint8_t*)&song->num_sequence_steps, sizeof(song->num_sequence_steps));
  74. for(uint16_t i = 0; i < song->num_sequence_steps; i++)
  75. {
  76. rwops = stream_write(tracker->stream, (uint8_t*)&song->sequence.sequence_step[i], sizeof(song->sequence.sequence_step[0]));
  77. }
  78. rwops = stream_write(tracker->stream, (uint8_t*)&song->num_patterns, sizeof(song->num_patterns));
  79. for(uint16_t i = 0; i < song->num_patterns; i++)
  80. {
  81. rwops = stream_write(tracker->stream, (uint8_t*)song->pattern[i].step, sizeof(TrackerSongPatternStep) * (song->pattern_length - 1));
  82. }
  83. rwops = stream_write(tracker->stream, (uint8_t*)&song->num_instruments, sizeof(song->num_instruments));
  84. for(uint16_t i = 0; i < song->num_instruments; i++)
  85. {
  86. save_instrument_inner(tracker->stream, song->instrument[i]);
  87. }
  88. file_stream_close(tracker->stream);
  89. tracker->is_saving = false;
  90. furi_string_free(filepath);
  91. UNUSED(file_removed);
  92. UNUSED(open_file);
  93. UNUSED(rwops);
  94. return false;
  95. }
  96. bool load_song_util(FlizzerTrackerApp* tracker, FuriString* filepath)
  97. {
  98. bool open_file = file_stream_open(tracker->stream, furi_string_get_cstr(filepath), FSAM_READ, FSOM_OPEN_ALWAYS);
  99. bool result = load_song(&tracker->song, tracker->stream);
  100. tracker->is_loading = false;
  101. file_stream_close(tracker->stream);
  102. furi_string_free(filepath);
  103. UNUSED(open_file);
  104. return result;
  105. }