TBool ELFFile::Init(const TText * const aFileName) // // Read the ELF file into memory // { delete [] iFileName; iFileName = new TText[strlen((const char *)aFileName)+1]; strcpy ((char *)iFileName, (const char *)aFileName); TInt error = HFile::Open(iFileName, &iFileHandle); if (error!=0) return EFalse; TInt flength = HFile::GetLength(iFileHandle); iElfFile = (Elf32_Ehdr *)HMem::Alloc(0,flength); if (!iElfFile) { Print(EPeError,"Failed to allocate memory to read in file.\n"); Close(); return EFalse; } if (!HFile::Read(iFileHandle,iElfFile,flength)) { Print(EPeError,"Unable to read file %s.\n",iFileName); Close(); return EFalse; } Close(); if (!IsValidFileHeader(iElfFile)) { Print(EPeError,"Invalid file header.\n"); return EFalse; } // we only support this....for the moment iCpu = ECpuArmV4; if (!InitHeaders()) return EFalse; if (!InitDllData()) return EFalse; iEntryPoint = iElfFile->e_entry; iCodeSize = GetCodeSize(); iDataSize = GetDataSize(); iBssSize = GetBssSize(); iStackReservedSize = 0x2000; iStackCommittedSize = 0x2000; iLinkedBase = iCodeSegmentHdr->p_vaddr; iImageIsDll = iDllData->ImageIsDll(); return ETrue; }
/////////////////////////////////////////////////////////////////////////////// //ピクセルデータをBitmapファイルへ書き込む int WriteBitmap(const char* filename, GLubyte* data, int width, int height){ FILE *fp; BitmapHeader header; BitmapInfoHeader info; int i=0; int j=0; int x; int y; // ファイルオープン if( ( fp = fopen(filename, "wb") )==NULL){ return -1; } //ヘッダ構造体の初期化 InitHeaders(&header, &info); //Bitmapサイズ info.width = width; info.height = height; //ファイル容量 header.filesize = width*height*3*sizeof(GLubyte) //ビット情報量 + 14 //BitmapHeader構造体サイズ + 40; //BitmapInfoHeader構造体サイズ //ヘッダ書き込み WriteHeader(&header,fp); WriteInfoHeader(&info,fp); // イメージデータ書き込み for( y=0 ; y < height ; y++ ){ for( x=0 ; x < width ; x++ ){ j=fwrite((data+x*3+3*y*width+2),sizeof(GLubyte),1,fp); j=fwrite((data+x*3+3*y*width+1),sizeof(GLubyte),1,fp); j=fwrite((data+x*3+3*y*width),sizeof(GLubyte),1,fp); } } // ファイルクローズ fclose(fp); return 0; }
/////////////////////////////////////////////////////////////////////////////// //ピクセルデータをBitmapファイルへ書き込む int WriteBitmap(const char* filename,int width, int height){ GLubyte *pixel_data; FILE *fp; BitmapHeader header; BitmapInfoHeader info; int alignmentParam; int i=0; int j=0; int x; int y; unsigned char zero=0; /////////////////////////////////////////////////////////////////////////// // チェック用の処理 // データ格納のサイズを設定 //glPixelStorei(GL_PACK_ALIGNMENT ,2); // データ格納の横幅に収まる幅のバイトの倍数を取得 glGetIntegerv( GL_PACK_ALIGNMENT,&alignmentParam); // 1画素3バイトとするとひとつの行は3*widthバイト+アルファ int glByteWidth; // 実際の横幅のバイト数 // データの幅のバイト数がalignmentParamの倍数であるかをチェック if( width*3%alignmentParam == 0) glByteWidth = width*3; else // そうでなければ,alignmentParamの倍数にあわせた幅のバイトサイズにする glByteWidth = width*3 + alignmentParam - (width*3)%alignmentParam; /////////////////////////////////////////////////////////////////////////// // 読み込み // メモリ確保 pixel_data = (GLubyte*)malloc((glByteWidth)*(height)*(sizeof(GLubyte))); // OpenGLによるピクセルデータの読み出し glReadPixels( 0,0, width,height, GL_RGB, GL_UNSIGNED_BYTE, pixel_data); /////////////////////////////////////////////////////////////////////////// // ファイルオープン if( ( fp = fopen(filename, "wb") )==NULL){ return -1; } //ヘッダ構造体の初期化 InitHeaders(&header, &info); //Bitmapサイズ info.width = width; info.height = height; int writeWidth; /////////////////////////////////////////////////////////////////////////// // BITMAP用の横幅の処理 // データの幅のバイト数が4の倍数であるかをチェック if( width*3%4 == 0) writeWidth = width*3; else // そうでなければ,4の倍数にあわせた幅のバイトサイズにする writeWidth = width*3 + 4 - (width*3)%4; /////////////////////////////////////////////////////////////////////////// //ファイル容量 header.filesize = writeWidth*height //ビット情報量 + 14 //BitmapHeader構造体サイズ + 40; //BitmapInfoHeader構造体サイズ //ヘッダ書き込み WriteHeader(&header,fp); WriteInfoHeader(&info,fp); /////////////////////////////////////////////////////////////////////////// // イメージデータ書き込み for( y=0 ; y < height ; y++ ){ // データをBGRの順で書き込み for( x=0 ; x < width ; x++ ){ j=fwrite((pixel_data+x*3+glByteWidth*y+2),sizeof(GLubyte),1,fp); j=fwrite((pixel_data+x*3+glByteWidth*y+1),sizeof(GLubyte),1,fp); j=fwrite((pixel_data+x*3+glByteWidth*y),sizeof(GLubyte),1,fp); } // 幅のバイト数が4の倍数でないときは0で埋める if( width*3%4 != 0) for( int j=0;j<4-(width*3)%4;j++) fwrite(&zero,sizeof(GLubyte),1,fp); } /////////////////////////////////////////////////////////////////////////// // メモリ開放 free(pixel_data); // ファイルクローズ fclose(fp); return 0; }
int JackWinMMEDriver::Open(bool capturing, bool playing, int inchannels, int outchannels, bool monitor, const char* capture_driver_name, const char* playback_driver_name, jack_nframes_t capture_latency, jack_nframes_t playback_latency) { jack_log("JackWinMMEDriver::Open"); fRealCaptureChannels = midiInGetNumDevs(); fRealPlaybackChannels = midiOutGetNumDevs(); // Generic JackMidiDriver Open if (JackMidiDriver::Open(capturing, playing, fRealCaptureChannels, fRealPlaybackChannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency) != 0) return -1; fMidiDestination = new MidiSlot[fRealCaptureChannels]; assert(fMidiDestination); // Real input int devindex = 0; for (int i = 0; i < fRealCaptureChannels; i++) { HMIDIIN handle; fMidiDestination[devindex].fIndex = i; MMRESULT ret = midiInOpen(&handle, fMidiDestination[devindex].fIndex, (DWORD)MidiInProc, (DWORD)fRingBuffer[devindex], CALLBACK_FUNCTION); if (ret == MMSYSERR_NOERROR) { fMidiDestination[devindex].fHandle = handle; if (!InitHeaders(&fMidiDestination[devindex])) { jack_error("memory allocation failed"); midiInClose(handle); continue; } ret = midiInPrepareHeader(handle, fMidiDestination[devindex].fHeader, sizeof(MIDIHDR)); if (ret == MMSYSERR_NOERROR) { fMidiDestination[devindex].fHeader->dwUser = 1; ret = midiInAddBuffer(handle, fMidiDestination[devindex].fHeader, sizeof(MIDIHDR)); if (ret == MMSYSERR_NOERROR) { ret = midiInStart(handle); if (ret != MMSYSERR_NOERROR) { jack_error("midiInStart error"); CloseInput(&fMidiDestination[devindex]); continue; } } else { jack_error ("midiInAddBuffer error"); CloseInput(&fMidiDestination[devindex]); continue; } } else { jack_error("midiInPrepareHeader error"); midiInClose(handle); continue; } } else { jack_error ("midiInOpen error"); continue; } devindex += 1; } fRealCaptureChannels = devindex; fCaptureChannels = devindex; fMidiSource = new MidiSlot[fRealPlaybackChannels]; assert(fMidiSource); // Real output devindex = 0; for (int i = 0; i < fRealPlaybackChannels; i++) { MMRESULT res; HMIDIOUT handle; fMidiSource[devindex].fIndex = i; UINT ret = midiOutOpen(&handle, fMidiSource[devindex].fIndex, 0L, 0L, CALLBACK_NULL); if (ret == MMSYSERR_NOERROR) { fMidiSource[devindex].fHandle = handle; if (!InitHeaders(&fMidiSource[devindex])) { jack_error("memory allocation failed"); midiOutClose(handle); continue; } res = midiOutPrepareHeader(handle, fMidiSource[devindex].fHeader, sizeof(MIDIHDR)); if (res != MMSYSERR_NOERROR) { jack_error("midiOutPrepareHeader error %d %d %d", i, handle, res); continue; } else { fMidiSource[devindex].fHeader->dwUser = 1; } } else { jack_error("midiOutOpen error"); continue; } devindex += 1; } fRealPlaybackChannels = devindex; fPlaybackChannels = devindex; return 0; }