所謂回調函數(call-back),就是不被程序員調用而是被其他函數或過程調用的函數。通常利用函數指針實現。回調函數一般都具有指定的參數表格式以便正確地分配地址。
madlib開放給用戶的唯一接口就是6個回調函數,這6個回調函數都是以enum mad_flow爲返回值。enum mad_flow ,這個枚舉在頭文件decode.h和mad.h中均有定義:
解碼器每次調用回調函數後都會檢查返回值,根據返回值決定下一個動作。最基本的解碼器至少要實現6個回調函數中的兩個——input(decoder_init函數的第三個參數)和output(decoder_init函數的第六個參數)。其中input回調函數在解碼器開始運行前將mp3文件在內存中鏡像的起始指針和結束指針傳遞給mad_stream,然後不再起作用(爲簡單起見,這裏使輸入的mp3文件在一開始就全部映射進內存,實際當中input回調函數可以只將部分mp3幀映射進內存緩衝,而後在解碼過程中被反覆調用來重新填充“Refill”緩衝區);而output回調函數會在整個解碼過程中被反覆調用,來處理PCM的最終輸出。