To improve the program, a few changes can be made in the future, especially in terms of efficiency.
The loop that compares the nine time lengths between the incoming and hard-coded arrays can be made to have an increment of 2 instead of 1, which means that all the time lengths of one (which are consistent between any button press) are skipped.
A completely different approach can be taken in hard-coding the array used to compare with the incoming message. By grouping buttons that have similar time lengths can narrow down the number of comparison iterations required as compared to now where each incoming message is compared incrementally to each message in the hard-coded array.
One step taken at the present is that the first few messages in the hard-coded array (which are checked first upon incoming message) are the most commonly used: volume up/down, Key_0, Key_1, Key_2.
Finally, implementing the end-of-message detection knowing that each message always has the same ending time lengths eliminates the need to wait at least 25ms (time-out indicating signal is at idle stage) before waiting to decode the message and change outputs.