+#endif
+
+/* returns shmid on success */
+static int save_afd(struct audio_file_data *afd)
+{
+ size_t path_size = strlen(afd->path) + 1;
+ size_t size = sizeof(*afd) + path_size
+ + 4 * (afd->afhi.chunks_total + 1);
+
+ PARA_NOTICE_LOG("size: %zu\n", size);
+ int shmid, ret = shm_new(size);
+ void *shm_afd;
+ char *buf;
+
+ if (ret < 0)
+ return ret;
+ shmid = ret;
+ ret = shm_attach(shmid, ATTACH_RW, &shm_afd);
+ if (ret < 0)
+ goto err;
+ *(struct audio_file_data *)shm_afd = *afd;
+ buf = shm_afd;
+ buf += sizeof(*afd);
+ strcpy(buf, afd->path);
+ buf += path_size;
+ save_chunk_table(&afd->afhi, buf);
+ shm_detach(shm_afd);
+ return shmid;
+err:
+ shm_destroy(shmid);
+ return ret;
+}
+
+int load_afd(int shmid, struct audio_file_data *afd)
+{
+ void *shm_afd;
+ char *buf;
+ int ret;
+
+ ret = shm_attach(shmid, ATTACH_RO, &shm_afd);
+ if (ret < 0)
+ return ret;
+ *afd = *(struct audio_file_data *)shm_afd;
+ buf = shm_afd;
+ buf += sizeof(*afd);
+ afd->path = para_strdup(buf);
+ buf += strlen(buf) + 1;
+ afd->afhi.chunk_table = para_malloc((afd->afhi.chunks_total + 1) * 4);
+ load_chunk_table(&afd->afhi, buf);
+ shm_detach(shm_afd);
+ return 1;
+}