diskop.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "diskop.h"
  2. void load_instrument_inner(Stream* stream, Instrument* inst, uint8_t version) {
  3. UNUSED(version);
  4. size_t rwops = stream_read(stream, (uint8_t*)inst->name, sizeof(inst->name));
  5. rwops = stream_read(stream, (uint8_t*)&inst->waveform, sizeof(inst->waveform));
  6. rwops = stream_read(stream, (uint8_t*)&inst->flags, sizeof(inst->flags));
  7. rwops =
  8. stream_read(stream, (uint8_t*)&inst->sound_engine_flags, sizeof(inst->sound_engine_flags));
  9. rwops = stream_read(stream, (uint8_t*)&inst->base_note, sizeof(inst->base_note));
  10. rwops = stream_read(stream, (uint8_t*)&inst->finetune, sizeof(inst->finetune));
  11. rwops = stream_read(stream, (uint8_t*)&inst->slide_speed, sizeof(inst->slide_speed));
  12. rwops = stream_read(stream, (uint8_t*)&inst->adsr, sizeof(inst->adsr));
  13. rwops = stream_read(stream, (uint8_t*)&inst->pw, sizeof(inst->pw));
  14. if(inst->sound_engine_flags & SE_ENABLE_RING_MOD) {
  15. rwops = stream_read(stream, (uint8_t*)&inst->ring_mod, sizeof(inst->ring_mod));
  16. }
  17. if(inst->sound_engine_flags & SE_ENABLE_HARD_SYNC) {
  18. rwops = stream_read(stream, (uint8_t*)&inst->hard_sync, sizeof(inst->hard_sync));
  19. }
  20. uint8_t progsteps = 0;
  21. rwops = stream_read(stream, (uint8_t*)&progsteps, sizeof(progsteps));
  22. if(progsteps > 0) {
  23. rwops = stream_read(stream, (uint8_t*)inst->program, progsteps * sizeof(inst->program[0]));
  24. }
  25. rwops = stream_read(stream, (uint8_t*)&inst->program_period, sizeof(inst->program_period));
  26. if(inst->flags & TE_ENABLE_VIBRATO) {
  27. rwops = stream_read(stream, (uint8_t*)&inst->vibrato_speed, sizeof(inst->vibrato_speed));
  28. rwops = stream_read(stream, (uint8_t*)&inst->vibrato_depth, sizeof(inst->vibrato_depth));
  29. rwops = stream_read(stream, (uint8_t*)&inst->vibrato_delay, sizeof(inst->vibrato_delay));
  30. }
  31. if(inst->flags & TE_ENABLE_PWM) {
  32. rwops = stream_read(stream, (uint8_t*)&inst->pwm_speed, sizeof(inst->pwm_speed));
  33. rwops = stream_read(stream, (uint8_t*)&inst->pwm_depth, sizeof(inst->pwm_depth));
  34. rwops = stream_read(stream, (uint8_t*)&inst->pwm_delay, sizeof(inst->pwm_delay));
  35. }
  36. if(inst->sound_engine_flags & SE_ENABLE_FILTER) {
  37. rwops = stream_read(stream, (uint8_t*)&inst->filter_cutoff, sizeof(inst->filter_cutoff));
  38. rwops =
  39. stream_read(stream, (uint8_t*)&inst->filter_resonance, sizeof(inst->filter_resonance));
  40. rwops = stream_read(stream, (uint8_t*)&inst->filter_type, sizeof(inst->filter_type));
  41. }
  42. UNUSED(rwops);
  43. }
  44. bool load_song_inner(TrackerSong* song, Stream* stream) {
  45. uint8_t version = 0;
  46. size_t rwops = stream_read(stream, (uint8_t*)&version, sizeof(version));
  47. if(version >
  48. TRACKER_ENGINE_VERSION) // if song is of newer version this version of tracker engine can't support
  49. {
  50. return false;
  51. }
  52. tracker_engine_deinit_song(song, false);
  53. memset(song, 0, sizeof(TrackerSong));
  54. rwops = stream_read(stream, (uint8_t*)song->song_name, sizeof(song->song_name));
  55. rwops = stream_read(stream, (uint8_t*)&song->loop_start, sizeof(song->loop_start));
  56. rwops = stream_read(stream, (uint8_t*)&song->loop_end, sizeof(song->loop_end));
  57. rwops = stream_read(stream, (uint8_t*)&song->pattern_length, sizeof(song->pattern_length));
  58. rwops = stream_read(stream, (uint8_t*)&song->speed, sizeof(song->speed));
  59. rwops = stream_read(stream, (uint8_t*)&song->rate, sizeof(song->rate));
  60. rwops =
  61. stream_read(stream, (uint8_t*)&song->num_sequence_steps, sizeof(song->num_sequence_steps));
  62. for(uint16_t i = 0; i < song->num_sequence_steps; i++) {
  63. rwops = stream_read(
  64. stream,
  65. (uint8_t*)&song->sequence.sequence_step[i],
  66. sizeof(song->sequence.sequence_step[0]));
  67. }
  68. rwops = stream_read(stream, (uint8_t*)&song->num_patterns, sizeof(song->num_patterns));
  69. for(uint16_t i = 0; i < song->num_patterns; i++) {
  70. song->pattern[i].step = (TrackerSongPatternStep*)malloc(
  71. sizeof(TrackerSongPatternStep) * (song->pattern_length));
  72. set_empty_pattern(&song->pattern[i], song->pattern_length);
  73. rwops = stream_read(
  74. stream,
  75. (uint8_t*)song->pattern[i].step,
  76. sizeof(TrackerSongPatternStep) * (song->pattern_length));
  77. }
  78. rwops = stream_read(stream, (uint8_t*)&song->num_instruments, sizeof(song->num_instruments));
  79. for(uint16_t i = 0; i < song->num_instruments; i++) {
  80. song->instrument[i] = (Instrument*)malloc(sizeof(Instrument));
  81. set_default_instrument(song->instrument[i]);
  82. load_instrument_inner(stream, song->instrument[i], version);
  83. }
  84. UNUSED(rwops);
  85. return false;
  86. }
  87. bool load_song(TrackerSong* song, Stream* stream) {
  88. char header[sizeof(SONG_FILE_SIG) + 2] = {0};
  89. size_t rwops = stream_read(stream, (uint8_t*)&header, sizeof(SONG_FILE_SIG) - 1);
  90. header[sizeof(SONG_FILE_SIG)] = '\0';
  91. if(strcmp(header, SONG_FILE_SIG) == 0) {
  92. bool result = load_song_inner(song, stream);
  93. UNUSED(result);
  94. }
  95. UNUSED(rwops);
  96. return false;
  97. }