Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-11-25 16:07:28 +0300
committerTon Roosendaal <ton@blender.org>2006-11-25 16:07:28 +0300
commit604b4230325aa012efb063e0a3fd2ac23809e393 (patch)
tree10d0b42f972550484bde3d9d47a72bbbd68a956e /source/blender/src/editsound.c
parentb78b3a4761849bd7e2b368884e05c40ef58d12d0 (diff)
- 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... :/
Diffstat (limited to 'source/blender/src/editsound.c')
-rw-r--r--source/blender/src/editsound.c170
1 files changed, 62 insertions, 108 deletions
diff --git a/source/blender/src/editsound.c b/source/blender/src/editsound.c
index b1ec94d123b..bd209f2d39c 100644
--- a/source/blender/src/editsound.c
+++ b/source/blender/src/editsound.c
@@ -201,7 +201,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
void sound_initialize_sounds(void)
{
- bSound* sound;
+ bSound *sound;
if(ghSoundScene) {
@@ -212,8 +212,7 @@ void sound_initialize_sounds(void)
/* initialize sample blocks (doesnt call audio system, needs to be done once after load */
sound = G.main->sound.first;
- while (sound)
- {
+ while (sound) {
sound_sample_is_null(sound);
sound = (bSound *) sound->id.next;
}
@@ -221,9 +220,9 @@ void sound_initialize_sounds(void)
-bSound* sound_make_copy(bSound* originalsound)
+bSound *sound_make_copy(bSound *originalsound)
{
- bSound* sound = NULL;
+ bSound *sound = NULL;
char name[160];
int len;
@@ -273,7 +272,7 @@ bSound* sound_make_copy(bSound* originalsound)
-void sound_initialize_sample(bSound* sound)
+void sound_initialize_sample(bSound *sound)
{
if(ghSoundScene==NULL) sound_init_audio();
@@ -282,7 +281,7 @@ void sound_initialize_sample(bSound* sound)
}
-void sound_read_wav_data(bSound* sound, PackedFile* pf)
+void sound_read_wav_data(bSound *sound, PackedFile *pf)
{
int i, temp;
short shortbuf, *temps;
@@ -299,36 +298,31 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
rewindPackedFile(pf);
/* check to see if it is a file in "RIFF WAVE fmt" format */
- if (readPackedFile(pf, buffer, 16) != 16)
- {
+ if (readPackedFile(pf, buffer, 16) != 16) {
if (G.f & G_DEBUG) printf("File too short\n");
return;
}
- if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8)))
- {
+ if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) {
readPackedFile(pf, &i, 4);// start of data
if(G.order==B_ENDIAN)
SWITCH_INT(i);
/* read the sampleformat */
readPackedFile(pf, &shortbuf, 2);
- if(G.order==B_ENDIAN)
- {
+ if(G.order==B_ENDIAN) {
SWITCH_SHORT(shortbuf);
}
/* read the number of channels */
readPackedFile(pf, &shortbuf, 2);
- if(G.order==B_ENDIAN)
- {
+ if(G.order==B_ENDIAN) {
SWITCH_SHORT(shortbuf);
}
/* check the number of channels */
- if(shortbuf != 1 && shortbuf != 2)
- {
+ if(shortbuf != 1 && shortbuf != 2) {
if (G.f & G_DEBUG) printf("Unsupported number of channels\n");
return;
}
@@ -356,8 +350,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
readPackedFile(pf, &shortbuf, 2);
readPackedFile(pf, &shortbuf, 2);
- if(G.order==B_ENDIAN)
- {
+ if(G.order==B_ENDIAN) {
SWITCH_SHORT(shortbuf);
}
bits = shortbuf;
@@ -365,8 +358,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
seekPackedFile(pf, i-16, SEEK_CUR);
readPackedFile(pf, buffer, 4);
/* check if we have a 'data' chunk */
- while(memcmp(buffer, "data", 4)!=0)
- {
+ while(memcmp(buffer, "data", 4)!=0) {
if (readPackedFile(pf, &i, 4) != 4)
break;
@@ -379,13 +371,11 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
}
/* guess not */
- if (memcmp(buffer, "data", 4) !=0)
- {
+ if (memcmp(buffer, "data", 4) !=0) {
if (G.f & G_DEBUG) printf("No data found\n");
}
/* or maybe we do! */
- else
- {
+ else {
readPackedFile(pf, &longbuf, 4);
if(G.order==B_ENDIAN) SWITCH_INT(longbuf);
@@ -399,21 +389,17 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
len = longbuf /*/ 4.0*/; /* for some strange reason the sample length is off by a factor of 4... */
/* intrr's comment: Funny eh, how one 16-bit stereo sample is 4 bytes? :-) */
- if(data)
- {
+ if(data) {
readPackedFile(pf, data, len);
/* data is only used to draw! */
- if (bits == 8)
- {
+ if (bits == 8) {
temps = (short *) data;
tempc = (char *) data;
for (i = len - 1; i >= 0; i--)
temps[i] = tempc[i] << 8;
}
- else
- {
- if(G.order==B_ENDIAN)
- {
+ else {
+ if(G.order==B_ENDIAN) {
swab(data, data, len);
}
}
@@ -428,8 +414,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
}
}
}
- else
- {
+ else {
sound->sample->type = SAMPLE_INVALID;
if (G.f & G_DEBUG) printf("Unsupported sound format: %s\n", sound->name);
}
@@ -438,7 +423,7 @@ void sound_read_wav_data(bSound* sound, PackedFile* pf)
/* ugly, but it works (for now) */
-static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
+static int sound_get_filetype_from_header(bSound *sound, PackedFile *pf)
{
int filetype = SAMPLE_INVALID;
int i;
@@ -447,22 +432,19 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
rewindPackedFile(pf);
- if (readPackedFile(pf, buffer, 16) != 16)
- {
+ if (readPackedFile(pf, buffer, 16) != 16) {
if (G.f & G_DEBUG) printf("File too short\n");
return filetype;
}
- if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8)))
- {
+ if(!(memcmp(buffer, "RIFF", 4) && memcmp(&(buffer[8]), "WAVEfmt ", 8))) {
readPackedFile(pf, &i, 4);
if(G.order==B_ENDIAN)
SWITCH_INT(i);
/* read the sampleformat */
readPackedFile(pf, &shortbuf, 2);
- if(G.order==B_ENDIAN)
- {
+ if(G.order==B_ENDIAN) {
char s_i, *p_i;
p_i= (char *)&(shortbuf);
s_i= p_i[0];
@@ -470,8 +452,7 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
p_i[1]= s_i;
}
- if (shortbuf == SND_WAVE_FORMAT_PCM)
- {
+ if (shortbuf == SND_WAVE_FORMAT_PCM) {
filetype = SAMPLE_WAV;
}
else
@@ -500,17 +481,14 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
#ifdef USE_FMOD
}
}
- else if (!memcmp(buffer, "OggS", 4))
- {
+ else if (!memcmp(buffer, "OggS", 4)) {
filetype = SAMPLE_OGG_VORBIS;
}
- else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "", 2)))
- {
+ else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "", 2))) {
filetype = SAMPLE_MP3;
}
#endif
- else
- {
+ else {
filetype = SAMPLE_INVALID;
if (G.f & G_DEBUG) printf("Unsupported sound format: %s\n", sound->name);
}
@@ -520,7 +498,7 @@ static int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
-static int check_filetype(bSound* sound, PackedFile* pf)
+static int check_filetype(bSound *sound, PackedFile *pf)
{
// char* pdest;
sound->sample->type = SAMPLE_INVALID;
@@ -550,8 +528,7 @@ static int check_filetype(bSound* sound, PackedFile* pf)
sound->sample->type = sound_get_filetype_from_header(sound, pf);
/* get some info from the sample */
- switch (sound->sample->type)
- {
+ switch (sound->sample->type) {
case SAMPLE_WAV:
{
sound_read_wav_data(sound, pf);
@@ -576,24 +553,22 @@ static int check_filetype(bSound* sound, PackedFile* pf)
-int sound_load_sample(bSound* sound)
+int sound_load_sample(bSound *sound)
{
int result = FALSE;
- PackedFile* pf;
+ PackedFile *pf;
int freePF = FALSE;
int buffer = -1;
if(ghSoundScene==NULL) sound_init_audio();
/* check the sample (valid?) */
- if (sound->sample->type == SAMPLE_UNKNOWN || sound->snd_sound == NULL)
- {
+ if (sound->sample->type == SAMPLE_UNKNOWN || sound->snd_sound == NULL) {
/* find... */
pf = sound_find_packedfile(sound);
/* ...or create a (temp)packedfile */
- if (pf == NULL)
- {
+ if (pf == NULL) {
pf = newPackedFile(sound->name);
/* if autopack is off, free the pf afterwards */
@@ -602,14 +577,12 @@ int sound_load_sample(bSound* sound)
}
/* if we have a valid pf... */
- if (pf)
- {
+ if (pf) {
/* check the content of the pf */
check_filetype(sound, pf);
/* check if the sampletype is supported */
- if (sound->sample->type != SAMPLE_INVALID && sound->sample->type != SAMPLE_UNKNOWN)
- {
+ if (sound->sample->type != SAMPLE_INVALID && sound->sample->type != SAMPLE_UNKNOWN) {
/* register the sample at the audiodevice */
buffer = SND_AddSample(ghSoundScene, sound->sample->name, pf->data, pf->size);
@@ -628,33 +601,28 @@ int sound_load_sample(bSound* sound)
result = TRUE;
}
/* if not, free the pf */
- else
- {
+ else {
freePF = TRUE;
}
/* if you want it freed, make it so */
- if (freePF)
- {
+ if (freePF) {
freePackedFile(pf);
pf = NULL;
}
/* or else connect the pf to the sound and sample */
-// else
-// {
+// else {
sound->newpackedfile = pf;
sound->sample->packedfile = pf;
// }
}
- else
- {
+ else {
if (G.f & G_DEBUG) printf("%s: File not found!\n", sound->name);
sound->sample->type = SAMPLE_INVALID;
}
}
/* if the sample ain't invalid, we're ready to go! */
- else if (sound->sample->type != SAMPLE_INVALID)
- {
+ else if (sound->sample->type != SAMPLE_INVALID) {
result = TRUE;
}
@@ -663,7 +631,7 @@ int sound_load_sample(bSound* sound)
-bSound* sound_new_sound(char* name)
+bSound *sound_new_sound(char *name)
{
bSound *sound = NULL;
int len, file;
@@ -679,8 +647,7 @@ bSound* sound_new_sound(char* name)
/* check if the sample on disk can be opened */
file = open(str, O_BINARY|O_RDONLY);
- if (file != -1)
- {
+ if (file != -1) {
close(file);
@@ -699,8 +666,7 @@ bSound* sound_new_sound(char* name)
/* load the sample & check if this blender supports the sound format */
// sound_load_sample(sound);
- if (sound->sample->type == SAMPLE_INVALID)
- {
+ if (sound->sample->type == SAMPLE_INVALID) {
free_libblock(&G.main->sound, sound);
sound = NULL;
}
@@ -725,13 +691,8 @@ int sound_set_sample(bSound *sound, bSample *sample)
if(ghSoundScene==NULL) sound_init_audio();
- /* decrease the usernumber for this sample */
- if (sound->sample)
- sound->sample->id.us--;
-
/* delete the soundobject */
- if (sound->snd_sound)
- {
+ if (sound->snd_sound) {
SND_RemoveSound(ghSoundScene, sound->snd_sound);
sound->snd_sound = NULL;
}
@@ -740,22 +701,17 @@ int sound_set_sample(bSound *sound, bSample *sample)
sound->sample = sample;
sound->newpackedfile = NULL;
- /* increase the usercount */
- if (sound->sample)
- {
- sound->sample->id.us++;
+ if (sound->sample) {
/* and set the right pf */
sound->newpackedfile = sample->packedfile;
/* if the sampletype is unknown initialize it */
- if (sound->sample->type == SAMPLE_UNKNOWN)
- {
+ if (sound->sample->type == SAMPLE_UNKNOWN) {
sound_initialize_sample(sound);
/* load the sample & check if this blender supports the sound format */
- if (!sound_load_sample(sound))
- {
+ if (!sound_load_sample(sound)) {
result = FALSE;
}
}
@@ -766,14 +722,13 @@ int sound_set_sample(bSound *sound, bSample *sample)
-bSample *sound_new_sample(bSound * sound)
+bSample *sound_new_sample(bSound *sound)
{
bSample *sample = NULL;
int len;
char *name;
- if (sound != NULL)
- {
+ if (sound != NULL) {
name = sound->name;
len = strlen(name);
/* do some name magic */
@@ -781,7 +736,10 @@ bSample *sound_new_sample(bSound * sound)
len--;
/* allocate the memory for the sample */
- sample = alloc_libblock(samples, ID_SAMPLE, name + len);
+ sample = MEM_callocN(sizeof(bSample), "sample");
+ BLI_strncpy(sample->id.name+2, name+len, 20);
+ BLI_addtail(samples, sample); /* samples is ugly global */
+
sample->data = &sample->fakedata[0];
sample->type = SAMPLE_UNKNOWN;
@@ -808,9 +766,9 @@ bSample *sound_new_sample(bSound * sound)
/* find a sample that might already be loaded */
-bSample* sound_find_sample(bSound* sound)
+bSample *sound_find_sample(bSound *sound)
{
- bSample* sample;
+ bSample *sample;
char name[FILE_MAXDIR + FILE_MAXFILE];
char samplename[FILE_MAXDIR + FILE_MAXFILE];
@@ -820,14 +778,11 @@ bSample* sound_find_sample(bSound* sound)
/* search through the list of loaded samples */
sample = samples->first;
-
- while (sample)
- {
+ while (sample) {
strcpy(samplename, sample->name);
BLI_convertstringcode(samplename, G.sce, G.scene->r.cfra);
- if (strcmp(name, samplename) == 0)
- {
+ if (strcmp(name, samplename) == 0) {
break;
}
sample = sample->id.next;
@@ -838,16 +793,15 @@ bSample* sound_find_sample(bSound* sound)
-int sound_sample_is_null(bSound* sound)
+int sound_sample_is_null(bSound *sound)
{
int result = FALSE;
- bSample* sample;
+ bSample *sample;
if(ghSoundScene==NULL) sound_init_audio();
/* find the right sample or else create one */
- if (sound->sample == NULL)
- {
+ if (sound->sample == NULL) {
/* find... */
sample = sound_find_sample(sound);
@@ -888,7 +842,7 @@ void sound_end_all_sounds(void)
-void sound_play_sound(bSound* sound)
+void sound_play_sound(bSound *sound)
{
#if GAMEBLENDER == 1
if(ghSoundScene==NULL) sound_init_audio();