summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.c2
-rw-r--r--src/task.c26
-rw-r--r--tools/aif2pcm/main.c27
3 files changed, 33 insertions, 22 deletions
diff --git a/src/main.c b/src/main.c
index f0ad4ce94..992d23ead 100644
--- a/src/main.c
+++ b/src/main.c
@@ -298,7 +298,7 @@ void InitIntrHandlers(void)
REG_IME = 1;
- EnableInterrupts(0x1);
+ EnableInterrupts(INTR_FLAG_VBLANK);
}
void SetVBlankCallback(IntrCallback callback)
diff --git a/src/task.c b/src/task.c
index a97496009..3a3ddadfd 100644
--- a/src/task.c
+++ b/src/task.c
@@ -136,32 +136,20 @@ void TaskDummy(u8 taskId)
{
}
-#define TASK_DATA_OP(taskId, offset, op) \
-{ \
- u32 tasksAddr = (u32)gTasks; \
- u32 addr = taskId * sizeof(struct Task) + offset; \
- u32 dataAddr = tasksAddr + offsetof(struct Task, data); \
- addr += dataAddr; \
- op; \
-}
-
void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc)
{
- TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc)
- TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16)
+ u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const.
+
+ gTasks[taskId].data[followupFuncIndex] = (s16)((u32)followupFunc);
+ gTasks[taskId].data[followupFuncIndex + 1] = (s16)((u32)followupFunc >> 16); // Store followupFunc as two half-words in the data array.
gTasks[taskId].func = func;
}
void SwitchTaskToFollowupFunc(u8 taskId)
{
- s32 func;
-
- gTasks[taskId].func = NULL;
-
- TASK_DATA_OP(taskId, 28, func = *((u16 *)addr))
- TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16)
+ u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const.
- gTasks[taskId].func = (TaskFunc)func;
+ gTasks[taskId].func = (TaskFunc)((u16)(gTasks[taskId].data[followupFuncIndex]) | (gTasks[taskId].data[followupFuncIndex + 1] << 16));
}
bool8 FuncIsActiveTask(TaskFunc func)
@@ -183,7 +171,7 @@ u8 FindTaskIdByFunc(TaskFunc func)
if (gTasks[i].isActive == TRUE && gTasks[i].func == func)
return (u8)i;
- return 0xFF;
+ return TAIL_SENTINEL; // No task was found.
}
u8 GetTaskCount(void)
diff --git a/tools/aif2pcm/main.c b/tools/aif2pcm/main.c
index cd5ac4a50..3dad6fcf8 100644
--- a/tools/aif2pcm/main.c
+++ b/tools/aif2pcm/main.c
@@ -351,6 +351,12 @@ const int gDeltaEncodingTable[] = {
-64, -49, -36, -25, -16, -9, -4, -1,
};
+#define POSITIVE_DELTAS_START 0
+#define POSITIVE_DELTAS_END 8
+
+#define NEGATIVE_DELTAS_START 8
+#define NEGATIVE_DELTAS_END 16
+
struct Bytes *delta_decompress(struct Bytes *delta, unsigned int expected_length)
{
struct Bytes *pcm = malloc(sizeof(struct Bytes));
@@ -418,15 +424,32 @@ struct Bytes *delta_decompress(struct Bytes *delta, unsigned int expected_length
return pcm;
}
+#define U8_TO_S8(value) ((value) < 128 ? (value) : (value) - 256)
+#define ABS(value) ((value) >= 0 ? (value) : -(value))
+
int get_delta_index(uint8_t sample, uint8_t prev_sample)
{
int best_error = INT_MAX;
int best_index = -1;
+ int delta_table_start_index;
+ int delta_table_end_index;
+ int sample_signed = U8_TO_S8(sample);
+ int prev_sample_signed = U8_TO_S8(prev_sample);
+
+ // if we're going up (or equal), only choose positive deltas
+ if (prev_sample_signed <= sample_signed) {
+ delta_table_start_index = POSITIVE_DELTAS_START;
+ delta_table_end_index = POSITIVE_DELTAS_END;
+ } else {
+ delta_table_start_index = NEGATIVE_DELTAS_START;
+ delta_table_end_index = NEGATIVE_DELTAS_END;
+ }
- for (int i = 0; i < 16; i++)
+ for (int i = delta_table_start_index; i < delta_table_end_index; i++)
{
uint8_t new_sample = prev_sample + gDeltaEncodingTable[i];
- int error = sample > new_sample ? sample - new_sample : new_sample - sample;
+ int new_sample_signed = U8_TO_S8(new_sample);
+ int error = ABS(new_sample_signed - sample_signed);
if (error < best_error)
{