This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/blenkernel/intern/sound.c
Ton Roosendaal 604b423032 - Library linking feature: global undo/redo now doesn't read the linked
library .blend files anymore, making it a load faster to use.

- Fixed ancient annoyance; samples were not properly freed, giving a lot
  "Error Totblock" when using sound.
  This fix also involves removing an ancient NaN hack, which treated the
  samples as fake Library data in the Main database.
  But still, the Blender Sound and Sample code is horrible... :/
2006-11-25 13:07:28 +00:00

139 lines
3.0 KiB
C

/**
* sound.c (mar-2001 nzc)
*
* $Id$
*/
#include <string.h>
#include <stdlib.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "DNA_scene_types.h"
#include "DNA_sound_types.h"
#include "DNA_packedFile_types.h"
#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_sound.h"
#include "BKE_packedFile.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
ListBase _samples = {0,0}, *samples = &_samples;
void sound_free_sound(bSound *sound)
{
/* when sounds have been loaded, but not played, the packedfile was not copied
to sample block and not freed otherwise */
if(sound->sample==NULL) {
if (sound->newpackedfile) {
freePackedFile(sound->newpackedfile);
sound->newpackedfile = NULL;
}
}
if (sound->stream) free(sound->stream);
}
void sound_free_sample(bSample *sample)
{
if (sample) {
if (sample->data != &sample->fakedata[0] && sample->data != NULL) {
MEM_freeN(sample->data);
sample->data = &sample->fakedata[0];
}
if (sample->packedfile) {
freePackedFile(sample->packedfile); //FIXME: crashes sometimes
sample->packedfile = NULL;
}
if (sample->alindex != SAMPLE_INVALID) {
// AUD_free_sample(sample->snd_sample);
sample->alindex = SAMPLE_INVALID;
}
sample->type = SAMPLE_INVALID;
}
}
/* this is called after file reading or undos */
void sound_free_all_samples(void)
{
bSample *sample;
bSound *sound;
/* ensure no sample pointers exist, and check packedfile */
for(sound= G.main->sound.first; sound; sound= sound->id.next) {
if(sound->sample && sound->sample->packedfile==sound->newpackedfile)
sound->newpackedfile= NULL;
sound->sample= NULL;
}
/* now free samples */
for(sample= samples->first; sample; sample= sample->id.next)
sound_free_sample(sample);
BLI_freelistN(samples);
}
void sound_set_packedfile(bSample *sample, PackedFile *pf)
{
bSound *sound;
if (sample) {
sample->packedfile = pf;
sound = G.main->sound.first;
while (sound) {
if (sound->sample == sample) {
sound->newpackedfile = pf;
if (pf == NULL) {
strcpy(sound->name, sample->name);
}
}
sound = sound->id.next;
}
}
}
PackedFile* sound_find_packedfile(bSound *sound)
{
bSound *search;
PackedFile *pf = NULL;
char soundname[FILE_MAXDIR + FILE_MAXFILE], searchname[FILE_MAXDIR + FILE_MAXFILE];
// convert sound->name to abolute filename
strcpy(soundname, sound->name);
BLI_convertstringcode(soundname, G.sce, G.scene->r.cfra);
search = G.main->sound.first;
while (search) {
if (search->sample && search->sample->packedfile) {
strcpy(searchname, search->sample->name);
BLI_convertstringcode(searchname, G.sce, G.scene->r.cfra);
if (BLI_streq(searchname, soundname)) {
pf = search->sample->packedfile;
break;
}
}
if (search->newpackedfile) {
strcpy(searchname, search->name);
BLI_convertstringcode(searchname, G.sce, G.scene->r.cfra);
if (BLI_streq(searchname, soundname)) {
pf = search->newpackedfile;
break;
}
}
search = search->id.next;
}
return (pf);
}