Diffstat (limited to 'gammu/emb/common/service/gsmring.c') (more/less context) (show whitespace changes)
-rw-r--r-- | gammu/emb/common/service/gsmring.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/gammu/emb/common/service/gsmring.c b/gammu/emb/common/service/gsmring.c index 7df46f1..dab028c 100644 --- a/gammu/emb/common/service/gsmring.c +++ b/gammu/emb/common/service/gsmring.c @@ -1,21 +1,24 @@ /* (c) 2001-2004 by Marcin Wiacek */ -/* Based on some work from Ralf Thelen (7110 ringtones), - * Gnokii (RTTL and SM) and others +/* Based on some work from Ralf Thelen (7110 ringtones) and others */ +/* Based on some work (RTTL and SM) from Gnokii (www.gnokii.org) + * (C) 1999-2000 Hugh Blemings & Pavel Janik ml. (C) 2001-2004 Pawel Kot + * GNU GPL version 2 or later */ #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> +#include <sys/stat.h> #ifdef WIN32 # include <windows.h> #endif #include "../gsmcomon.h" #include "../misc/coding/coding.h" #include "../gsmstate.h" #include "gsmring.h" #include "sms/gsmsms.h" int GSM_RingNoteGetFrequency(GSM_RingNote Note) { @@ -147,24 +150,30 @@ static GSM_Error savebin(FILE *file, GSM_Ringtone *ringtone) fwrite(&nullchar,1,1,file); fwrite(&nullchar,1,1,file); fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); return ERR_NONE; } static GSM_Error savepuremidi(FILE *file, GSM_Ringtone *ringtone) { fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); return ERR_NONE; } +static GSM_Error savemmf(FILE *file, GSM_Ringtone *ringtone) +{ + fwrite(ringtone->NokiaBinary.Frame,1,ringtone->NokiaBinary.Length,file); + return ERR_NONE; +} + GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone) { GSM_RingNoteScale DefNoteScale; GSM_RingNoteDuration DefNoteDuration; GSM_RingNoteStyle DefNoteStyle=0; int DefNoteTempo=0; bool started = false, firstcomma = true; GSM_RingNote *Note; unsigned char buffer[15]; @@ -476,24 +485,27 @@ GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone) } else if (strstr(FileName,".wav")) { savewav(file,ringtone); } else { saverttl(file, ringtone); } break; case RING_NOKIABINARY: savebin(file, ringtone); break; case RING_MIDI: savepuremidi(file, ringtone); break; + case RING_MMF: + savemmf(file, ringtone); + break; } fclose(file); return ERR_NONE; } static GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone) { GSM_RingNoteScale DefNoteScale = Scale_880; GSM_RingNoteDuration DefNoteDuration = Duration_1_4; GSM_RingNoteStyle DefNoteStyle = NaturalStyle; @@ -760,24 +772,44 @@ static GSM_Error loadbin(FILE *file, GSM_Ringtone *ringtone) static GSM_Error loadpuremidi(FILE *file, GSM_Ringtone *ringtone) { unsigned char buffer[30000]; dbgprintf("loading midi\n"); EncodeUnicode(ringtone->Name,"MIDI",4); ringtone->NokiaBinary.Length=fread(buffer, 1, 30000, file); memcpy(ringtone->NokiaBinary.Frame,buffer,ringtone->NokiaBinary.Length); dbgprintf("Length %i name \"%s\"\n",ringtone->NokiaBinary.Length,DecodeUnicodeString(ringtone->Name)); return ERR_NONE; } +static GSM_Error loadmmf(FILE *file, GSM_Ringtone *ringtone) +{ + struct stat st; + char *buffer; + int length; + + dbgprintf("loading smaf file\n"); + fstat(fileno(file), &st); + ringtone->BinaryTone.Length = length = st.st_size; + ringtone->BinaryTone.Buffer = buffer = malloc(length); + if (buffer == NULL) + return ERR_MOREMEMORY; + fread(buffer, 1, length, file); + + dbgprintf("Length %i name \"%s\"\n", length, + DecodeUnicodeString(ringtone->Name)); + + return ERR_NONE; +} + static GSM_Error loadre(FILE *file, GSM_Ringtone *ringtone) { unsigned char buffer[2000]; ringtone->NokiaBinary.Length=fread(buffer, 1, 500, file); if (buffer[18]==0x00 && buffer[21]!=0x02) { /* DCT3, Unicode subformat, 62xx & 7110 */ CopyUnicodeString(ringtone->Name,buffer+18); ringtone->NokiaBinary.Length = ringtone->NokiaBinary.Length - (21+UnicodeLength(ringtone->Name)*2); memcpy(ringtone->NokiaBinary.Frame,buffer+21+UnicodeLength(ringtone->Name)*2,ringtone->NokiaBinary.Length); } else { @@ -807,24 +839,28 @@ GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone) if (buffer[0]==0x00 && buffer[1]==0x00 && buffer[2]==0x0C && buffer[3]==0x01) { ringtone->Format = RING_NOKIABINARY; } if (buffer[0]==0x00 && buffer[1]==0x00 && buffer[2]==0x00) { ringtone->Format = RING_NOKIABINARY; } if (buffer[0]==0x4D && buffer[1]==0x54 && buffer[2]==0x68 && buffer[3]==0x64) { ringtone->Format = RING_MIDI; } + if (buffer[0]==0x4D && buffer[1]==0x4D && + buffer[2]==0x4D && buffer[3]==0x44) { + ringtone->Format = RING_MMF; + } } rewind(file); switch (ringtone->Format) { case RING_NOTETONE: if (buffer[0]==0x02 && buffer[1]==0x4A) { error=loadott(file,ringtone); } else if (buffer[0]==0xC7 && buffer[1]==0x45) { error=loadcommunicator(file,ringtone); } else { error=loadrttl(file,ringtone); } ringtone->NoteTone.AllNotesScale=false; @@ -833,24 +869,29 @@ GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone) if (buffer[0]==0x00 && buffer[1]==0x00 && buffer[2]==0x0C && buffer[3]==0x01) { error=loadbin(file,ringtone); } if (buffer[0]==0x00 && buffer[1]==0x00 && buffer[2]==0x00) { error=loadre(file,ringtone); } break; case RING_MIDI: EncodeUnicode(ringtone->Name,FileName,strlen(FileName)); error = loadpuremidi(file,ringtone); + break; + case RING_MMF: + EncodeUnicode(ringtone->Name,FileName,strlen(FileName)); + error = loadmmf(file,ringtone); + break; } fclose(file); return(error); } /* -------------------------- required with Nokia & RTTL ------------------- */ /* Beats per Minute like written in Smart Messaging */ static int SM_BeatsPerMinute[] = { 25, 28, 31, 35, 40, 45, 50, 56, 63, 70, 80, 90, 100, 112, 125, 140, 160, 180, 200, 225, 250, 285, 320, 355, 400, 450, 500, 565, 635, 715, |