/[svn]/libgig/trunk/src/DLS.cpp
ViewVC logotype

Diff of /libgig/trunk/src/DLS.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1184 by persson, Sun May 13 13:24:22 2007 UTC revision 1358 by schoenebeck, Sun Sep 30 18:13:33 2007 UTC
# Line 25  Line 25 
25    
26  #include <time.h>  #include <time.h>
27    
28    #ifdef __APPLE__
29    #include <CoreFoundation/CFUUID.h>
30    #elif defined(HAVE_UUID_UUID_H)
31    #include <uuid/uuid.h>
32    #endif
33    
34  #include "helper.h"  #include "helper.h"
35    
36  // macros to decode connection transforms  // macros to decode connection transforms
# Line 293  namespace DLS { Line 299  namespace DLS {
299              for (int i = 0 ; FixedStringLengths[i].length ; i++) {              for (int i = 0 ; FixedStringLengths[i].length ; i++) {
300                  if (FixedStringLengths[i].chunkId == ChunkID) {                  if (FixedStringLengths[i].chunkId == ChunkID) {
301                      size = FixedStringLengths[i].length;                      size = FixedStringLengths[i].length;
302                        break;
303                  }                  }
304              }              }
305          }          }
# Line 407  namespace DLS { Line 414  namespace DLS {
414       */       */
415      void Resource::UpdateChunks() {      void Resource::UpdateChunks() {
416          pInfo->UpdateChunks();          pInfo->UpdateChunks();
417          //TODO: save DLSID  
418            if (pDLSID) {
419                // make sure 'dlid' chunk exists
420                RIFF::Chunk* ckDLSID = pResourceList->GetSubChunk(CHUNK_ID_DLID);
421                if (!ckDLSID) ckDLSID = pResourceList->AddSubChunk(CHUNK_ID_DLID, 16);
422                uint8_t* pData = (uint8_t*)ckDLSID->LoadChunkData();
423                // update 'dlid' chunk
424                store32(&pData[0], pDLSID->ulData1);
425                store16(&pData[4], pDLSID->usData2);
426                store16(&pData[6], pDLSID->usData3);
427                memcpy(&pData[8], pDLSID->abData, 8);
428            }
429      }      }
430    
431        /**
432         * Generates a new DLSID for the resource.
433         */
434        void Resource::GenerateDLSID() {
435    #if defined(WIN32) || defined(__APPLE__) || defined(HAVE_UUID_GENERATE)
436    
437            if (!pDLSID) pDLSID = new dlsid_t;
438    
439    #ifdef WIN32
440    
441            UUID uuid;
442            UuidCreate(&uuid);
443            pDLSID->ulData1 = uuid.Data1;
444            pDLSID->usData2 = uuid.Data2;
445            pDLSID->usData3 = uuid.Data3;
446            memcpy(pDLSID->abData, uuid.Data4, 8);
447    
448    #elif defined(__APPLE__)
449    
450            CFUUIDRef uuidRef = CFUUIDCreate(NULL);
451            CFUUIDBytes uuid = CFUUIDGetUUIDBytes(uuidRef);
452            CFRelease(uuidRef);
453            pDLSID->ulData1 = uuid.byte0 | uuid.byte1 << 8 | uuid.byte2 << 16 | uuid.byte3 << 24;
454            pDLSID->usData2 = uuid.byte4 | uuid.byte5 << 8;
455            pDLSID->usData3 = uuid.byte6 | uuid.byte7 << 8;
456            pDLSID->abData[0] = uuid.byte8;
457            pDLSID->abData[1] = uuid.byte9;
458            pDLSID->abData[2] = uuid.byte10;
459            pDLSID->abData[3] = uuid.byte11;
460            pDLSID->abData[4] = uuid.byte12;
461            pDLSID->abData[5] = uuid.byte13;
462            pDLSID->abData[6] = uuid.byte14;
463            pDLSID->abData[7] = uuid.byte15;
464    #else
465            uuid_t uuid;
466            uuid_generate(uuid);
467            pDLSID->ulData1 = uuid[0] | uuid[1] << 8 | uuid[2] << 16 | uuid[3] << 24;
468            pDLSID->usData2 = uuid[4] | uuid[5] << 8;
469            pDLSID->usData3 = uuid[6] | uuid[7] << 8;
470            memcpy(pDLSID->abData, &uuid[8], 8);
471    #endif
472    #endif
473        }
474    
475    
476  // *************** Sampler ***************  // *************** Sampler ***************
# Line 427  namespace DLS { Line 488  namespace DLS {
488              SampleLoops    = wsmp->ReadUint32();              SampleLoops    = wsmp->ReadUint32();
489          } else { // 'wsmp' chunk missing          } else { // 'wsmp' chunk missing
490              uiHeaderSize   = 0;              uiHeaderSize   = 0;
491              UnityNote      = 64;              UnityNote      = 60;
492              FineTune       = 0; // +- 0 cents              FineTune       = 0; // +- 0 cents
493              Gain           = 0; // 0 dB              Gain           = 0; // 0 dB
494              SamplerOptions = F_WSMP_NO_COMPRESSION;              SamplerOptions = F_WSMP_NO_COMPRESSION;
# Line 451  namespace DLS { Line 512  namespace DLS {
512          if (pSampleLoops) delete[] pSampleLoops;          if (pSampleLoops) delete[] pSampleLoops;
513      }      }
514    
515        void Sampler::SetGain(int32_t gain) {
516            Gain = gain;
517        }
518    
519      /**      /**
520       * Apply all sample player options to the respective RIFF chunk. You       * Apply all sample player options to the respective RIFF chunk. You
521       * have to call File::Save() to make changes persistent.       * have to call File::Save() to make changes persistent.
# Line 488  namespace DLS { Line 553  namespace DLS {
553      /**      /**
554       * Adds a new sample loop with the provided loop definition.       * Adds a new sample loop with the provided loop definition.
555       *       *
556       * @param - points to a loop definition that is to be copied       * @param pLoopDef - points to a loop definition that is to be copied
557       */       */
558      void Sampler::AddSampleLoop(sample_loop_t* pLoopDef) {      void Sampler::AddSampleLoop(sample_loop_t* pLoopDef) {
559          sample_loop_t* pNewLoops = new sample_loop_t[SampleLoops + 1];          sample_loop_t* pNewLoops = new sample_loop_t[SampleLoops + 1];
# Line 852  namespace DLS { Line 917  namespace DLS {
917      }      }
918    
919      /**      /**
920         * Modifies the key range of this Region and makes sure the respective
921         * chunks are in correct order.
922         *
923         * @param Low  - lower end of key range
924         * @param High - upper end of key range
925         */
926        void Region::SetKeyRange(uint16_t Low, uint16_t High) {
927            KeyRange.low  = Low;
928            KeyRange.high = High;
929    
930            // make sure regions are already loaded
931            Instrument* pInstrument = (Instrument*) GetParent();
932            if (!pInstrument->pRegions) pInstrument->LoadRegions();
933            if (!pInstrument->pRegions) return;
934    
935            // find the r which is the first one to the right of this region
936            // at its new position
937            Region* r = NULL;
938            Region* prev_region = NULL;
939            for (
940                Instrument::RegionList::iterator iter = pInstrument->pRegions->begin();
941                iter != pInstrument->pRegions->end(); iter++
942            ) {
943                if ((*iter)->KeyRange.low > this->KeyRange.low) {
944                    r = *iter;
945                    break;
946                }
947                prev_region = *iter;
948            }
949    
950            // place this region before r if it's not already there
951            if (prev_region != this) pInstrument->MoveRegion(this, r);
952        }
953    
954        /**
955       * Apply Region settings to the respective RIFF chunks. You have to       * Apply Region settings to the respective RIFF chunks. You have to
956       * call File::Save() to make changes persistent.       * call File::Save() to make changes persistent.
957       *       *
# Line 902  namespace DLS { Line 1002  namespace DLS {
1002                  }                  }
1003              }              }
1004          }          }
         if (index < 0) throw Exception("Could not save Region, could not find Region's sample");  
1005          WavePoolTableIndex = index;          WavePoolTableIndex = index;
1006          // update 'wlnk' chunk          // update 'wlnk' chunk
1007          store16(&pData[0], WaveLinkOptionFlags);          store16(&pData[0], WaveLinkOptionFlags);

Legend:
Removed from v.1184  
changed lines
  Added in v.1358

  ViewVC Help
Powered by ViewVC