struct GPatch * gusload(char * filename)
{
    struct GPatch * gp = (struct GPatch *)malloc(sizeof(struct GPatch));
    rb->memset(gp, 0, sizeof(struct GPatch));

    int file = rb->open(filename, O_RDONLY);

    if(file < 0)
    {
        char message[50];
        rb->snprintf(message, 50, "Error opening %s", filename);
        rb->splash(HZ*2, message);
        return NULL;
    }

    gp->header=readData(file, 12);
    gp->gravisid=readData(file, 10);
    gp->desc=readData(file, 60);
    gp->inst=readChar(file);
    gp->voc=readChar(file);
    gp->chan=readChar(file);
    gp->numWaveforms=readWord(file);
    gp->vol=readWord(file);
    gp->datSize=readDWord(file);
    gp->res=readData(file, 36);

    gp->instrID=readWord(file);
    gp->instrName=readData(file,16);
    gp->instrSize=readDWord(file);
    gp->layers=readChar(file);
    gp->instrRes=readData(file,40);


    gp->layerDup=readChar(file);
    gp->layerID=readChar(file);
    gp->layerSize=readDWord(file);
    gp->numWaves=readChar(file);
    gp->layerRes=readData(file,40);


/*    printf("\nFILE: %s", filename); */
/*    printf("\nlayerSamples=%d", gp->numWaves); */

    int a=0;
    for(a=0; a<gp->numWaves; a++)
        gp->waveforms[a] = loadWaveform(file);


/*    printf("\nPrecomputing note table"); */

    for(a=0; a<128; a++)
    {
        gp->noteTable[a] = selectWaveform(gp, a);
    }
    rb->close(file);

    return gp;
}
struct GWaveform * loadWaveform(int file)
{
    struct GWaveform * wav = &waveforms[curr_waveform++];
    rb->memset(wav, 0, sizeof(struct GWaveform));

    wav->name=readData(file, 7);
/*    printf("\nWAVE NAME = [%s]", wav->name); */
    wav->fractions=readChar(file);
    wav->wavSize=readDWord(file);
    wav->startLoop=readDWord(file);
    wav->endLoop=readDWord(file);
    wav->sampRate=readWord(file);

    wav->lowFreq=readDWord(file);
    wav->highFreq=readDWord(file);
    wav->rootFreq=readDWord(file);

    wav->tune=readWord(file);

    wav->balance=readChar(file);
    wav->envRate=readData(file, 6);
    wav->envOffset=readData(file, 6);

    wav->tremSweep=readChar(file);
    wav->tremRate=readChar(file);
    wav->tremDepth=readChar(file);
    wav->vibSweep=readChar(file);
    wav->vibRate=readChar(file);
    wav->vibDepth=readChar(file);
    wav->mode=readChar(file);

    wav->scaleFreq=readWord(file);
    wav->scaleFactor=readWord(file);
/*    printf("\nScaleFreq = %d   ScaleFactor = %d   RootFreq = %d", wav->scaleFreq, wav->scaleFactor, wav->rootFreq); */
    wav->res=readData(file, 36);
    wav->data=readData(file, wav->wavSize);

    wav->numSamples = wav->wavSize / 2;
    wav->startLoop = wav->startLoop >> 1;
    wav->endLoop = wav->endLoop >> 1;
    unsigned int a=0;

    /* half baked 8 bit conversion  UNFINISHED*/
    /*
    if(wav->mode & 1 == 0)  //Whoops, 8 bit
    {
        wav->numSamples = wav->wavSize;

        //Allocate a block for the rest of it
        //It should end up right after the previous one.
        wav->wavSize = wav->wavSize * 2;
        void * foo = allocate(wav->wavSize);


        for(a=0; a<1000; a++)
            printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!!");


        for(a=wav->wavSize-1; a>0; a-=2)
        {

        }
    //  int b1=wf->data[s]+((wf->mode & 2) << 6);
    //  return b1<<8;
    }
    */


#ifdef ROCKBOX_BIG_ENDIAN
    /* Byte-swap if necessary. Gus files are little endian */
    for(a=0; a<wav->numSamples; a++)
    {
        ((uint16_t*) wav->data)[a] = letoh16(((uint16_t *) wav->data)[a]);
    }
#endif

    /*  Convert unsigned to signed by subtracting 32768 */
    if(wav->mode & 2)
    {
        for(a=0; a<wav->numSamples; a++)
            ((int16_t *) wav->data)[a] = ((uint16_t *) wav->data)[a] - 32768;

    }

    return wav;
}
Esempio n. 3
0
//--------------------------------------------------------
// open a BMP file to be read
BOOL mgBMPRead::open(
  const char* fileName)   // name of file to open
{
  // if file name exists 
  m_inFile = mgOSFileOpen(fileName, "rb");
  if (m_inFile == NULL)
    throw new mgErrorMsg("imgBadOpen", "", "");

  BitmapFileHeader fileHeader;
  fileHeader.bfType = readWord(m_inFile);
  fileHeader.bfSize = readDWord(m_inFile);
  fileHeader.bfReserved1 = readWord(m_inFile);
  fileHeader.bfReserved2 = readWord(m_inFile);
  fileHeader.bfOffBits = readDWord(m_inFile);
  if (fileHeader.bfType != 0x4D42)
    throw new mgErrorMsg("imgNotBmp", "filename", "%s", (const char*) fileName);

  BitmapInfoHeader infoHeader;
  infoHeader.biSize = readDWord(m_inFile);
  infoHeader.biWidth = (int) readDWord(m_inFile);
  infoHeader.biHeight = (int) readDWord(m_inFile);
  infoHeader.biPlanes = readWord(m_inFile);
  infoHeader.biBitCount = readWord(m_inFile);
  infoHeader.biCompression = readDWord(m_inFile);
  infoHeader.biSizeImage = readDWord(m_inFile);

  // handle uncompressed 24 and 32 bit images
  if (infoHeader.biCompression != BITMAP_COMPRESSION_RGB ||
      (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 32))
    throw new mgErrorMsg("imgBMPDepth", "filename", "%s", (const char*) fileName);

  m_width = infoHeader.biWidth;
  m_height = abs(infoHeader.biHeight);
  m_bitCount = infoHeader.biBitCount;
  m_reverse = infoHeader.biHeight > 0;

  // read the image data
  DWORD imageSize = m_height * m_width * m_bitCount/8;
  if (infoHeader.biSizeImage != 0 && infoHeader.biSizeImage != imageSize)
    throw new mgErrorMsg("imgBmpSize", "filename,calcSize,declSize", "%s,%d,%d", 
      (const char*) fileName, imageSize, infoHeader.biSizeImage);

  m_data = new BYTE[imageSize];
  fseek(m_inFile, fileHeader.bfOffBits, SEEK_SET);
  size_t bytesRead = fread(m_data, 1, imageSize, m_inFile);
  if (bytesRead != imageSize)
    throw new mgErrorMsg("imgBmpRead", "filename,size", "%s,%d", (const char*) fileName, imageSize);

  fclose(m_inFile);
  m_inFile = NULL;

  m_RGBAline = new BYTE[m_width * 4];
  m_y = 0;
  m_lineLen = m_width * m_bitCount/8;
  m_lineLen = 4*((m_lineLen+3)/4);

  if (!m_writer->outputStart(m_width, m_height))
    return false;

  return true;
}
Esempio n. 4
0
void parseBmp (char *fileName, BMP *bmp) {
	int i, j, k;
	char b, g, r;
	int pixels, rowOffset, offset;
	short int fh;

	fh = openFile(fileName);

	//Parse BMP header
	bmp->header.type = readWord(fh);
	bmp->header.size = readDWord(fh);
	bmp->header.reserved1 = readWord(fh);
	bmp->header.reserved2 = readWord(fh);
	bmp->header.offset = readDWord(fh);

	//Parse BMP info header
	bmp->infoheader.size = readDWord(fh);
	bmp->infoheader.width = readDWord(fh);
	bmp->infoheader.height = readDWord(fh);
	bmp->infoheader.planes = readWord(fh);
	bmp->infoheader.bits = readWord(fh);
	bmp->infoheader.compression = readDWord(fh);
	bmp->infoheader.imagesize = readDWord(fh);
	bmp->infoheader.xresolution = readDWord(fh);
	bmp->infoheader.yresolution = readDWord(fh);
	bmp->infoheader.ncolors = readDWord(fh);
	bmp->infoheader.importantcolors = readDWord(fh);

	pixels = bmp->infoheader.width * bmp->infoheader.height;
	bmp->color = malloc(BYTES_PER_PIXEL * pixels);

	for(i = 0; i < bmp->infoheader.height; i++) {
		rowOffset = i*bmp->infoheader.width;
		for(j = 0; j < bmp->infoheader.width; j++ ){
			offset = pixels - rowOffset - j - 1;

			/*
			 *RGB values are stored in reverse (BGR) in the .bmp file
			 *BMP is saved as 24 bit RGB, pixel buffer dma takes 16 bit RGB values
			 */
			b = (readByte(fh) & 0xF1) >> 3;
			g = (readByte(fh) & 0xFC) >> 2;
			r = (readByte(fh) & 0xF1) >> 3;

			//Filter out the pink pixels
			if(b == 0x1E && g == 0 && r == 0x1E) {
				bmp->color[offset] = 0x0;
			} else {
				bmp->color[offset] = (r << 11) | (g << 5) | b;
			}
		}

		//Each pixel row is padded so the amount of pixels is a multiple of 4
		if((BYTES_PER_PIXEL*bmp->infoheader.width) % 4 != 0) {
			for (k = 0; k <  (4 - ((BYTES_PER_PIXEL*bmp->infoheader.width) % 4)); k++) {
				readByte(fh);
			}
		}
	}

	closeFile(fh);
}
Esempio n. 5
0
File: bmp.c Progetto: jordenh/DE2VTT
//purpose: parse a BMP file and package in a BMP structure
void parseBmp (char *fileName, BMP *bmp) {
	int i, j, k;
	char b, g, r;
	int pixels, rowOffset, offset;
	short int fh;

	fh = openFile(fileName);

	bmp->header.type = readWord(fh);
	bmp->header.size = readDWord(fh);
	bmp->header.reserved1 = readWord(fh);
	bmp->header.reserved2 = readWord(fh);
	bmp->header.offset = readDWord(fh);

	bmp->infoheader.size = readDWord(fh);
	bmp->infoheader.width = readDWord(fh);
	bmp->infoheader.height = readDWord(fh);
	bmp->infoheader.planes = readWord(fh);
	bmp->infoheader.bits = readWord(fh);
	bmp->infoheader.compression = readDWord(fh);
	bmp->infoheader.imagesize = readDWord(fh);
	bmp->infoheader.xresolution = readDWord(fh);
	bmp->infoheader.yresolution = readDWord(fh);
	bmp->infoheader.ncolors = readDWord(fh);
	bmp->infoheader.importantcolors = readDWord(fh);

	pixels = bmp->infoheader.width * bmp->infoheader.height;
	bmp->color = malloc(BYTES_PER_PIXEL * pixels);

	for(i = 0; i < bmp->infoheader.height; i++) {
		rowOffset = i*bmp->infoheader.width;
		for(j = 0; j < bmp->infoheader.width; j++ ){
			offset = pixels - rowOffset - j - 1;

			b = (readByte(fh) & 0xF1) >> 3;
			g = (readByte(fh) & 0xFC) >> 2;
			r = (readByte(fh) & 0xF1) >> 3;

			//Filter out the pink pixels
			if(b == 0x1E && g == 0 && r == 0x1E) {
				bmp->color[offset] = 0x0;
			} else {
				bmp->color[offset] = (r << 11) | (g << 5) | b;
			}
		}

		if((BYTES_PER_PIXEL*bmp->infoheader.width) % 4 != 0) {
			for (k = 0; k <  (4 - ((BYTES_PER_PIXEL*bmp->infoheader.width) % 4)); k++) {
				readByte(fh);
			}
		}
	}

	closeFile(fh);
}
Esempio n. 6
0
void MergeFile::copyFormTo( MergeFile& out, dr_section sect,
                            uint_32& off, uint_32 form, uint_8 addrSize )
//-----------------------------------------------------------------------
{
    uint_32 num;
    char *  buffer;
    uint_32 bufLen;
    uint_8  buf8[ 8 ];

    switch( form ) {
            /* do all simple numeric forms */
    case DW_FORM_addr:
    case DW_FORM_flag:
    case DW_FORM_data1:
    case DW_FORM_ref1:
    case DW_FORM_data2:
    case DW_FORM_ref2:
    case DW_FORM_data4:
    case DW_FORM_ref4:
    case DW_FORM_sdata:
    case DW_FORM_udata:
    case DW_FORM_ref_udata:
    case DW_FORM_ref_addr:
        num = readForm( sect, off, form, addrSize );
        out.writeForm( form, num, addrSize );
        break;
    case DW_FORM_block1:
        bufLen = readByte( sect, off );
        out.writeByte( (uint_8) bufLen );
        if( bufLen ) {
            buffer = new char[ bufLen ];
            readBlock( sect, off, buffer, bufLen );
            out.writeBlock( buffer, bufLen );
            delete [] buffer;
        }
        break;
    case DW_FORM_block2:
        bufLen = readWord( sect, off );
        out.writeWord( (uint_16) bufLen );
        if( bufLen ) {
            buffer = new char[ bufLen ];
            readBlock( sect, off, buffer, bufLen );
            out.writeBlock( buffer, bufLen );
            delete [] buffer;
        }
        break;
    case DW_FORM_block4:
        bufLen = readDWord( sect, off );
        out.writeDWord( bufLen );
        if( bufLen ) {
            buffer = new char[ bufLen ];
            readBlock( sect, off, buffer, bufLen );
            out.writeBlock( buffer, bufLen );
            delete [] buffer;
        }
        break;
    case DW_FORM_block:
        bufLen = readULEB128( sect, off );
        if( bufLen ) {
            buffer = new char[ bufLen ];
            readBlock( sect, off, buffer, bufLen );
            out.writeBlock( buffer, bufLen );
            delete [] buffer;
        }
        break;
    case DW_FORM_data8:
        readBlock( sect, off, buf8, 8 );
        out.writeBlock( buf8, 8 );
        break;
    case DW_FORM_string:
        do {
            num = readByte( sect, off );
            out.writeByte( (uint_8) num );
        } while( num != 0 );
        break;
    case DW_FORM_indirect:
        num = readULEB128( sect, off );
        out.writeULEB128( num );
        copyFormTo( out, sect, off, num, addrSize );
        break;
    default:
        #if DEBUG
        printf( "ACK -- form %#x\n", form );
        #endif
        InternalAssert( 0 );
    }
}
Esempio n. 7
0
void MergeFile::skipForm( dr_section sect, uint_32& off, uint_32 form,
                            uint_8 addrSize )
//---------------------------------------------------------------------
{
    uint_32 value;

    switch( form ) {
    case DW_FORM_addr:
        off += addrSize;
        break;
    case DW_FORM_block1:
        off += readByte( sect, off );
        break;
    case DW_FORM_block2:
        off += readWord( sect, off );
        break;
    case DW_FORM_block4:
        off += readDWord( sect, off );
        break;
    case DW_FORM_block:
        value = readULEB128( sect, off );
        off += value;
        break;
    case DW_FORM_flag:
    case DW_FORM_data1:
    case DW_FORM_ref1:
        off += 1;
        break;
    case DW_FORM_data2:
    case DW_FORM_ref2:
        off += 2;
        break;
    case DW_FORM_ref_addr:      // NYI: non-standard behaviour for form_ref
    case DW_FORM_data4:
    case DW_FORM_ref4:
        off += 4;
        break;
    case DW_FORM_data8:
        off += 8;
        break;
    case DW_FORM_sdata:
        readSLEB128( sect, off );
        break;
    case DW_FORM_udata:
    case DW_FORM_ref_udata:
        readULEB128( sect, off );
        break;
    case DW_FORM_string:
        while( readByte( sect, off ) != 0 );
        break;
    case DW_FORM_indirect:
        value = readULEB128( sect, off );
        skipForm( sect, off, value, addrSize );
        break;
    default:
        #if DEBUG
        printf( "ACK -- form %#x\n", form );
        #endif
        InternalAssert( 0 );
    }
}