- ogg_stream_persfx_t* per_sfx;
-
- Con_DPrintf ("\"%s\" will be streamed\n", filename);
- per_sfx = (ogg_stream_persfx_t *)Mem_Alloc (snd_mempool, sizeof (*per_sfx));
- sfx->memsize += sizeof (*per_sfx);
- per_sfx->file = data;
- per_sfx->filesize = filesize;
- sfx->memsize += filesize;
-
- per_sfx->format.speed = vi->rate;
- per_sfx->format.width = 2; // We always work with 16 bits samples
- per_sfx->format.channels = vi->channels;
-
- sfx->fetcher_data = per_sfx;
- sfx->fetcher = &ogg_fetcher;
- sfx->flags |= SFXFLAG_STREAMED;
- sfx->total_length = (int)((size_t)len / (per_sfx->format.channels * 2) * ((double)snd_renderbuffer->format.speed / per_sfx->format.speed));
- sfx->loopstart = sfx->total_length;
- vc = qov_comment(&vf, -1);
- if(vc)
- {
- loopcomment = qvorbis_comment_query(vc, "LOOP_START", 0);
- if(loopcomment)
- sfx->loopstart = bound(0, (unsigned int) (atof(loopcomment) * (double)snd_renderbuffer->format.speed / (double)per_sfx->format.speed), sfx->total_length);
- }
- }
- else
- {
- char *buff;
- ogg_int64_t done;
- int bs, bigendian;
- long ret;
- snd_buffer_t *sb;
- snd_format_t ogg_format;
-
- Con_DPrintf ("\"%s\" will be cached\n", filename);
-
- // Decode it
- buff = (char *)Mem_Alloc (snd_mempool, (int)len);
- done = 0;
- bs = 0;
-#if BYTE_ORDER == BIG_ENDIAN
- bigendian = 1;
-#else
- bigendian = 0;
-#endif
- while ((ret = qov_read (&vf, &buff[done], (int)(len - done), bigendian, 2, 1, &bs)) > 0)
- done += ret;
-
- // Build the sound buffer
- ogg_format.speed = vi->rate;
- ogg_format.channels = vi->channels;
- ogg_format.width = 2; // We always work with 16 bits samples
- sb = Snd_CreateSndBuffer ((unsigned char *)buff, (size_t)done / (vi->channels * 2), &ogg_format, snd_renderbuffer->format.speed);
- if (sb == NULL)
- {
- qov_clear (&vf);
- Mem_Free (data);
- Mem_Free (buff);
- return false;
- }
-
- sfx->fetcher = &wav_fetcher;
- sfx->fetcher_data = sb;
-
- sfx->total_length = sb->nbframes;
- sfx->memsize += sb->maxframes * sb->format.channels * sb->format.width + sizeof (*sb) - sizeof (sb->samples);
-
- sfx->loopstart = sfx->total_length;
- sfx->flags &= ~SFXFLAG_STREAMED;
- vc = qov_comment(&vf, -1);
- if(vc)
- {
- loopcomment = qvorbis_comment_query(vc, "LOOP_START", 0);
- if(loopcomment)
- sfx->loopstart = bound(0, (unsigned int) (atoi(loopcomment) * (double)snd_renderbuffer->format.speed / (double)sb->format.speed), sfx->total_length);
- }
-
- qov_clear (&vf);
- Mem_Free (data);
- Mem_Free (buff);