92341
現在、Spresense上で下記サイトのSpresenseArduinoチュートリアルにおけるプレイリストの再生を試みています。  
<https://developer.sony.com/develop/spresense/docs/arduino_tutorials_ja.html>  
手順通りに作業を行ないリスト表示を行なったところ、下記画像のように1曲目が各曲の合間に表示されます。実際に動作させた場合にも、1曲目が合間に必ず流れてしまいます。  
[![Spresenseシリアルモニター上での曲のリスト表示](https://i.stack.imgur.com/MnPgi.png)](https://i.stack.imgur.com/MnPgi.png)

この現象はSpresense Reference
Boardのバージョン2.5.0以降で発生し、2.4.0では正常に動作することを確認できました。どのようにすればバージョン2.5.0以降でも正常に動作するようになるでしょうか？
CC BY-SA 4.0
2022-11-17T06:45:31.377
92275
2022-11-21T05:47:53.403
55461
question
spresense
SPRESENSEのプレイリスト再生において同じ曲が何度も流れてしまう問題について
SDKv2.4とSDKv2.5との差分を解析してみたところ、  
内部で自動生成されているalias_list_alltrack.binファイルのサイズと中身が異なっていて、  
これがプレイリストが正しく表示されない原因のようです。

スケッチ上でこのファイルを作り直せば、この問題を回避することができそうです。

  1. `player_playlist.ino` スケッチに `update_alias_file()` 関数を追加する

```

    static void update_alias_file(const char *dirname)
    {
      char     fname[64];
      File     file;
      uint32_t size;
      uint32_t *buffer;
      uint32_t i;
    
      sprintf(fname, "%s/alias_list_alltrack.bin", dirname);
    
      /* Read alias file into buffer */
      file = File(fname, FILE_READ);
      size = file.size();
      buffer = (uint32_t*)malloc(size);
      file.read(buffer, size);
      file.close();
    
      /* Create the correct alias file */
      if (buffer[1] == 0x0) {
        unlink(fname);
        file = File(fname, FILE_WRITE);
        for (i = 0; i < size / 4; i += 2) {
          file.write((uint8_t*)&buffer[i], 4);
        }
        file.close();
      }
      free(buffer);
      thePlaylist.select(Playlist::ListTypeAllTrack, "");
    }
    
```

  2. `thePlaylist.init()` の後ろに `update_alias_file()` の呼び出しを追加する

```

      success = thePlaylist.init(playlist_dirname);
      if (!success) {
        printf("ERROR: no exist playlist file %s/TRACK_DB.CSV\n",
               playlist_dirname);
        while (1);
      }
    
      update_alias_file(playlist_dirname); // ★★★ 追加
    
```
CC BY-SA 4.0
2022-11-21T05:47:53.403
92341
2022-11-21T05:47:53.403
31378
92275
answer