在播放音檔時,論文區域能夠跟著字幕的時間標記出目前所講的位置,完全是依賴「廣論字幕對應表」所描述的內容來完成。在廣論App計畫中,廣論字幕對應表的資料檔案是BookMap.java,其中mapStr這個字串陣列總共有320個字串,對應到320個音檔內容,字串內的元素是分號(;)來分隔每一筆記錄,每一筆記錄又以6個數字所組成,每一個數字所代表的意義如下所表示:

音檔序號, 字幕的序號, 頁數, 行數, 字數, 長度

  • 音檔序號:0 ~ 319, 對應到320個音檔。
  • 字幕序號:0 ~ n, 對應到該音檔的字幕序號。
  • 頁數位置,行數,字數: 定位到要反白標記的位置。
  • 長度:要反白的字串長度。

每一筆記錄中要對應音檔的播放時間與廣論的位置,簡而言之,前面兩個數字是對應到音檔的時間,後面四個數字是對應到廣論的內容。廣論App會每隔一段時間檢查目前播放的時間並找出該對應的字幕序號,再把字幕內容顯示在字幕區(請參閱字幕規則),為了減少計算量,第二個參數所對應到的是字幕的序號,也就是說當前面的計算找到字幕的序號時,同時也找到了論文該反白的位置。

建構該資料結構的程式如下(擷取自LamrimReaderActivity.java):

 

bookMap = new int[se.length][];
for (int i = 0; i < mediaBookMaps.length; i++) {
    int index = mediaBookMaps[i][1];
    if (index >= se.length) {
        bookMap[index] = new int[4];
        bookMap[index][0] = mediaBookMaps[i][BookMap.PAGE];
        bookMap[index][1] = mediaBookMaps[i][BookMap.LINE];
        bookMap[index][2] = mediaBookMaps[i][BookMap.WORD];
        bookMap[index][3] = mediaBookMaps[i][BookMap.LENGTH];
    }
}


for (int i = 1; i < bookMap.length; i++)
    if (bookMap[i] == null)
        bookMap[i]=bookMap[i-1];

 

bookMap是存放上述的對應表的陣列,為了讓程式可以快速的對應找到要反白的位置,將bookMap建構成與字幕陣列一樣長度(se.length),先在對應表中填入每一筆記錄(第一個for迴圈),接著再將中間未填資料的部份填入該位置之前的最後一筆記錄,依序填滿以後就完成我們所需要的資料結構,執行時便可以照著前面的描述快速的找到對應的資料。

 

在LamrimReader.Core中,解讀的工具為BookMapUtil.java,因標記廣論與字幕對應較多為圖形界面的工作,故此工具檔案僅提供解讀記錄中的6個欄位,回傳二維陣列給取用者,以利取用者接續繪製的工作。