/*
 * song_info.c
 *
 *  Created on: Oct 9, 2025
 *      Author: sowgro
 */

#include "song.h"
#include "activity4.h"
#include <stdint.h>
#include "song_info.h"
#include "endian_converters.h"

song_info_t get_song_info(uint8_t *p_song) {
	song_info_t ret = {0, 0, 0};
//	header_t *header = (header_t *) p_song;
	p_song += sizeof(header_t) - 2; // move pointer past header
	p_song += 4; // move past MTrk label

	uint32_t MTrk_len = convert_to_uint32(p_song); // read in size of MTrk
	p_song += sizeof(MTrk_len);

	for (uint8_t *p_end = p_song + MTrk_len; p_song != p_end; p_song++) {
		// FF 02 - copyright
		if (convert_to_uint16(p_song) == 0xFF02) {
			p_song += sizeof(uint16_t);
			uint8_t ev_len = *(uint8_t *) p_song;
			p_song += sizeof(ev_len);
			ret.copyright = (char *) p_song;
			ret.copyright[ev_len] = 0;
		}

		// FF 03 - title
		if (convert_to_uint16(p_song) == 0xFF03) {
			p_song += sizeof(uint16_t);
			uint8_t ev_len = *(uint8_t *) p_song;
			p_song += sizeof(ev_len);
			ret.title = (char *) p_song;
			ret.title[ev_len] = 0;
		}

		// FF 51 - tempo
		if (convert_to_uint16(p_song) == 0xFF51) {
			p_song += sizeof(uint16_t);
			p_song += sizeof(uint8_t); // skip length, always 03
			ret.tempo = convert_to_uint24(p_song);
		}
	}

	return ret;
}
