164 lines
4.2 KiB
C
164 lines
4.2 KiB
C
#include "TrackData.h"
|
|
#include "rlog.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
int TrackData_createGetTrack(TrackData* trackData, const char* name)
|
|
{
|
|
int index = sync_find_track(&trackData->syncData, name);
|
|
if (index < 0)
|
|
{
|
|
index = sync_create_track(&trackData->syncData, name);
|
|
memset(&trackData->tracks[index], 0, sizeof(Track));
|
|
trackData->tracks[index].color = TrackData_getNextColor(trackData);
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static uint32_t s_colors[] =
|
|
{
|
|
0xffb27474,
|
|
0xffb28050,
|
|
0xffa9b250,
|
|
0xff60b250,
|
|
|
|
0xff4fb292,
|
|
0xff4f71b2,
|
|
0xff8850b2,
|
|
0xffb25091,
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
uint32_t TrackData_getNextColor(TrackData* trackData)
|
|
{
|
|
return s_colors[(trackData->lastColor++) & 0x7];
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static int findSeparator(const char* name)
|
|
{
|
|
int i, len = strlen(name);
|
|
|
|
for (i = 0; i < len; ++i)
|
|
{
|
|
if (name[i] == ':')
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static int countGroup(const char* name, struct sync_data* syncData, int index)
|
|
{
|
|
int i, group_count = 0, count = syncData->num_tracks;
|
|
|
|
for (i = index; i < count; ++i)
|
|
{
|
|
if (strstr(syncData->tracks[i]->name, name))
|
|
group_count++;
|
|
}
|
|
|
|
return group_count;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
static void insertTracksInGroup(Group* group, const char* name, bool* processedTracks, TrackData* trackData, int index)
|
|
{
|
|
int i, group_index = 0, count = trackData->syncData.num_tracks;
|
|
struct sync_data* sync = &trackData->syncData;
|
|
|
|
for (i = index; i < count; ++i)
|
|
{
|
|
if (processedTracks[i])
|
|
continue;
|
|
|
|
if (strstr(sync->tracks[i]->name, name))
|
|
{
|
|
rlog(R_DEBUG, "Inserted track %s into group %s\n", sync->tracks[i]->name, group->name);
|
|
group->t.tracks[group_index++] = &trackData->tracks[i];
|
|
processedTracks[i] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void TrackData_linkGroups(TrackData* trackData)
|
|
{
|
|
int i, found, current_group = 0, track_count;
|
|
char group_name[256];
|
|
bool processed_tracks[EDITOR_MAX_TRACKS];
|
|
struct sync_data* sync = &trackData->syncData;
|
|
|
|
// set whatever we have processed a track or not
|
|
|
|
memset(processed_tracks, 0, sizeof(processed_tracks));
|
|
|
|
trackData->groupCount = 0;
|
|
|
|
if (!sync->tracks)
|
|
return;
|
|
|
|
for (i = 0, track_count = sync->num_tracks; i < track_count; ++i)
|
|
{
|
|
int group_count;
|
|
const char* track_name = sync->tracks[i]->name;
|
|
Group* group = &trackData->groups[current_group];
|
|
|
|
if (processed_tracks[i])
|
|
continue;
|
|
|
|
Track* track = &trackData->tracks[i];
|
|
found = findSeparator(track_name);
|
|
|
|
if (found == -1)
|
|
{
|
|
rlog(R_DEBUG, "Track %s didn't have any group. Adding as single track\n", track_name);
|
|
group->type = GROUP_TYPE_TRACK;
|
|
group->t.track = track;
|
|
group->trackCount = 1;
|
|
processed_tracks[i] = true;
|
|
current_group++;
|
|
continue;
|
|
}
|
|
|
|
rlog(R_DEBUG, "Found track with grouping %s\n", track_name);
|
|
|
|
// Found a group, lets dig out the groupname
|
|
|
|
memset(group_name, 0, sizeof(group_name));
|
|
memcpy(group_name, track_name, found + 1);
|
|
|
|
group->name = strdup(group_name);
|
|
group->type = GROUP_TYPE_GROUP;
|
|
|
|
rlog(R_DEBUG, "Group name %s\n", group_name);
|
|
|
|
// count tracks that are in the group and allocate space for them
|
|
|
|
group_count = countGroup(group_name, sync, i);
|
|
|
|
rlog(R_DEBUG, "Found %d tracks for group %s\n", group_count, group_name);
|
|
|
|
group->t.tracks = (Track**)malloc(sizeof(Track**) * group_count);
|
|
group->trackCount = group_count;
|
|
|
|
insertTracksInGroup(group, group_name, processed_tracks, trackData, i);
|
|
|
|
current_group++;
|
|
}
|
|
|
|
trackData->groupCount = current_group;
|
|
|
|
rlog(R_DEBUG, "Total amount of groups (and separate tracks) %d\n", current_group);
|
|
}
|
|
|