約 6,125,507 件
https://w.atwiki.jp/fiji/pages/14.html
目的 Electric Fenceを使ってheapの不正アクセスを検出する コード このsourceは10文字分しか確保していないのに20文字分使っています #include stdio.h #include string.h #include malloc.h int main() { char *buf; int i; buf = (char*)malloc(10); for (i = 0; i 20; i++) { fprintf(stderr, "%d\n", i); buf[i]=i; } return(0); } 実行 $ gcc -o mem mem.c -g $ ./mem # 不正なメモリアクセスをしているのに正常終了する $ sudo apt-get install electric-fence # electric fenceをインストール $ LD_PRELOAD=/usr/lib/libefence.so ./mem # 起動時にshared libraryをloadしmemを実行する 0 1 2 3 4 5 6 7 8 9 10 11 12 Segmentation fault (core dumped) # 10byte確保しても4byte境界によって12byteにalignmentされるため12で落ちる $ env EF_ALIGNMENT=1 LD_PRELOAD=/usr/lib/libefence.so ./mem # alignmentをoffしmemを実行 0 1 2 3 4 5 6 7 8 9 10 Segmentation fault (core dumped) buffer underflow env EF_PROTECT_BELOW=1 LD_PRELOAD=/usr/lib/libefence.so ./mem EF_PROTECT_FREE 1 free() 後のアクセス不許可 EF_ALLOW_MALLOC_0 0 malloc(0) の不許可 EF_PROTECT_BELOW 0 ヒープの上へのアクセス不許可 EF_PROTECT_BELOW 1 ヒープの下へのアクセス不許可
https://w.atwiki.jp/amaeda/pages/53.html
FFTWマニュアル - FFTWリファレンス - データタイプとファイル - メモリ確保 メモリ確保 Memory Allocation void *fftw_malloc( size_t n ); void fftw_free( void *p ); これらは、mallocやfreeとほとんど同じ働きを持ちます。唯一、返り値のポインタがFFTWのすべてのアルゴリズム(例えばSIMD高速化)に必要な制約を満たすこちだけがことなります。3.1節のデータの並びも参照のこと。 fftw_mallocで確保されたメモリは、通常のfreeではなく、fftw_freeで解放しなければいけません。 これらのルーチンは、ただ単にユーザーのOSのmallocを呼び出し、必要であればメモリ配置がそろった同等の関数を呼びます(memalignなど)。したがって、通常は時間や空間のオーバーヘッドが著しく生じる心配はありません。また、データを確保するのに必ずしもこの関数を呼び出す必要はありませんが、この方法を強く推奨します。 記 C++では、通常のmallocと同様に、fftw_mallocの出力を確保する型にキャストする必要があります。
https://w.atwiki.jp/objcmemo/pages/27.html
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 生成 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ SomeClass *obj = [[SomeClass] alloc] init]; SomeClass *obj = [SomeClass new]; SomeClass *obj = SompeClass.new; _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 型一致チェック _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ id object = [[UIView alloc] init]; NSLog(@"object is member of UIView? %@", [object isMemberOfClass [UIView class]]? @"YES" @"NO"); NSLog(@"object is member of UIString? %@", [object isMemberOfClass [NSString class]]? @"YES" @"NO"); _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 型一致チェック(継承関係含) _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ id object = [[UIView alloc] init]; NSLog(@"object is kind of UIView? %@", [object isKindOfClass [UIView class]]? @"YES" @"NO"); NSLog(@"object is kind of UIResponder? %@", [object isKindOfClass [UIResponder class]]? @"YES" @"NO"); NSLog(@"object is kind of NSObject? %@", [object isKindOfClass [NSObject class]]? @"YES" @"NO"); _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ クラス名取得 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ id object = [[UIView alloc] init]; NSLog(@"object is %@", NSStringFromClass([object class])); _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ メソッド名取得 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ SEL selector = @selector(func ); NSLog(@"selector is %@", NSStringFromSelector(selector)); _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ クラス判定 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ if ([object isKindOfClass [NSNull class]]) { // null } else if ([object isKindOfClass [NSNumber class]]) { // Number/Boolean } else if ([object isKindOfClass [NSString class]]) { // String } else if ([object isKindOfClass [NSArray class]]) { // Array } else if ([object isKindOfClass [NSDictionary class]]) { // Object NSLog(@"NSDictionary %@", responseData.description); }
https://w.atwiki.jp/aerocats/pages/51.html
標準Linuxの/usr/local/bin/内にある。 スクリプト #!/bin/sh # KURO-BOX/PRO shell script common routines. # Ver 1.002007/01/17 new by Y.H. # DEFAULT_IP=192.168.11.150 ENETNAME=eth0 #setup global environment values. MTD_SHARE=`grep extra /proc/mtd| sed -e "s/ .*//"` MTD_UIMAGE=`grep uImage /proc/mtd|sed -e "s/ .*//"` MTD_ROOTFS=`grep rootfs /proc/mtd|sed -e "s/ .*//"` MTD_UBOOT=mtd0 MTD_SHARE_DEV=/dev/${MTD_SHARE} MTD_UIMAGE_DEV=/dev/${MTD_UIMAGE} MTD_ROOTFS_DEV=/dev/${MTD_ROOTFS} MTD_RBOOT_DEV=/dev/${MTD_UBOOT} MTD_UIMAGE_CHARDEV_MINORNUM=`echo ${MTD_UIMAGE_DEV}|sed -e "s/.*mtd//"|sed -e "s/.*mtdblock//"` MTD_UIMAGE_CHARDEV=/dev/mtdchar${MTD_UIMAGE_CHARDEV_MINORNUM} MTD_ROOTFS_CHARDEV_MINORNUM=`echo ${MTD_ROOTFS_DEV}|sed -e "s/.*mtd//"|sed -e "s/.*mtdblock//"` MTD_ROOTFS_CHARDEV=/dev/mtdchar${MTD_ROOTFS_CHARDEV_MINORNUM} MTD_SHARE_CHARDEV_MINORNUM=`echo ${MTD_SHARE_DEV}|sed -e "s/.*mtd//"|sed -e "s/.*mtdblock//"` MTD_SHARE_CHARDEV=/dev/mtdchar${MTD_SHARE_CHARDEV_MINORNUM} DISK1_DEV=/dev/sda DISK2_DEV=/dev/sdb DISK1_MPT=/mnt/disk1 DISK2_MPT=/mnt/disk2 MTD_MPT=/mnt/mtd RAMDISK_MPT=/mnt/ram RAMDISK_DEV=/dev/ram1 RAMDISK_SIZE=8 KERNEL_EVENT_TAIL=/proc/buffalo/kernevnt FIRST_NAND=/etc/first_boot MICONAPL=/usr/local/sbin/miconapl HEXDUMP=/usr/bin/hexdump CHANGE_TO_DEVHDD_FILE=${MTD_MPT}/ChangeMeDevHDD SCSI_MAJOR=8 SCSI1_MINOR_BASE=0 SCSI2_MINOR_BASE=16 # $1 device of check target # retval # 1 device $1 is mounted. # 0 device $1 is not mounted. IsMounted(){ MOUNTED=`grep $1 /proc/mounts` if [ "${MOUNTED}" != "" ] ; then return 1 else return 0 fi return 0 } # $1 return value of evaluate target. DispSF(){ if [ "$1" -eq 0 ] ; then echo [Success] else echo [Failed ] fi } # $1 Executing shellscript. (mainly used for rcS) # $2 Option(default is start) exec_sh(){ if [ ! x"$2" = x"" ] ; then EXEC_OPT=$2 else EXEC_OPT=start fi echo "" echo "===== Starting $1 =====" /etc/init.d/$1 ${EXEC_OPT} DispSF $? echo "" } # $1 Check target mount point. CheckMPT(){ if [ "$1" != "" ] ; then echo "Checking MPT($1) is exist or not." if [ ! -e "$1" ] ; then echo "$1 not exist. So create a directory, now." mkdir $1 -p chmod 777 $1 else echo "$1 is exist. So no need to create a directory." fi else echo "Checking MPT target is something wrong." fi } create_sysfolder(){ rm -rf ${RAMDISK_MPT} mkdir -m 777 -p ${RAMDISK_MPT} mount -t tmpfs -o mode=1777,size=${RAMDISK_SIZE}m ${RAMDISK_DEV} ${RAMDISK_MPT} if [ $? -ne 0 ] ; then echo "*** ERROR! ${RAMDISK_MPT} mount fail!!" reboot -f fi mkdir -m 777 -p /mnt/ram/tmp /mnt/ram/var/tmp /mnt/ram/var/run rm -rf /tmp /var ln -sf /mnt/ram/tmp /tmp ln -sf /mnt/ram/var /var mkdir -m 777 -p /var/lock mkdir -m 755 -p /var/empty/sshd mkdir -m 755 -p /var/lib/dhcp mkdir -m 755 -p /var/lib/nfs chown rpcuser rpcuser /var/lib/nfs mkdir -m 755 -p /var/lock/subsys mkdir -m 755 -p /var/lock/perfmon mkdir -m 755 -p /var/lock/printing mkdir -m 755 -p /var/log/hotplug mkdir -m 755 -p /var/log/samba mkdir -m 755 -p /var/log/linkstation mkdir -m 755 -p /var/run/usb mkdir -m 755 -p /var/spool ln -s /etc/cron /var/spool/cron MODEL=`grep PRODUCTNAME /proc/buffalo/firmware|sed -e "s/PRODUCTNAME=//"` echo "KUROUTOSHIKOU KUROBOX Series ${MODEL}" /etc/issue ln -sf issue /etc/issue.net rm -f /var/lock/* } # $1 target device to format Format_EXT3(){ echo "***** Starting to format $1 *****" mkfs.ext3 $1 if [ $? -eq 0 ] ; then echo "Format is succeeded without error." else return 1 exit 1 fi return 0 } # $1 target device to format. Format_XFS(){ KEY=`dd if=$1 bs=1 count=3` if [ "${KEY}" = "XFS" ] ; then . /etc/melco/info if [ "${force_format}" = "yes" ] ; then echo "Disk (or partition) is looks like already formatted." echo "If you stop format, Press Ctrl+C in 10 seconds!!!" COUNTER=10 echo -n "waiting " while [ ${COUNTER} -gt 0 ] do echo -n "." sleep 1 COUNTER=$((${COUNTER} - 1)) done echo "" echo "OK, go on formatting." else return 0 fi fi echo "***** Cleaning Disk partition information *****" dd if=/dev/zero of=$1 bs=512 count=1 echo "***** Starting to format $1 *****" mkfs.xfs $1 -f if [ $? -eq 0 ] ; then echo "Format is succeeded without error." else return 1 exit 1 fi return 0 } # $1 target device to check partition # ret 0 this is no partition disk. # ret 1 this is nand share type partition # ret 2 this is developkit type partition (maybe) IsHavePartition(){ if [ -x ${HEXDUMP} ] ; then DISK_1_PART_TAIL=`hexdump -s 446 -n 64 -e 8/1 "%02x " 2/4 "%10d " "\n" $1 | sed -n "1p"|awk {print $10} ` DISK_2_PART_TAIL=`hexdump -s 446 -n 64 -e 8/1 "%02x " 2/4 "%10d " "\n" $1 | sed -n "2p"|awk {print $10} ` DISK_3_PART_TAIL=`hexdump -s 446 -n 64 -e 8/1 "%02x " 2/4 "%10d " "\n" $1 | sed -n "3p"|awk {print $10} ` DISK_4_PART_TAIL=`hexdump -s 446 -n 64 -e 8/1 "%02x " 2/4 "%10d " "\n" $1 | sed -n "4p"|awk {print $10} ` if [ "${DISK_1_PART_TAIL}" -ne 0 -a "${DISK_2_PART_TAIL}" -eq 0 -a "${DISK_3_PART_TAIL}" -eq 0 -a "${DISK_4_PART_TAIL}" -eq 0 ] ; then return 1 elif [ "${DISK_1_PART_TAIL}" -ne 0 -a "${DISK_2_PART_TAIL}" -ne 0 -a "${DISK_3_PART_TAIL}" -ne 0 -a "${DISK_4_PART_TAIL}" -ne 0 ] ; then return 2 else return 0 fi else return 0 fi return 0 } # $1 target device to mount. # $2 target mountpoint of $1. # $3 File system of target device(default is xfs). # $4 Mounted device permission(default is 777). MountShare(){ # ret 0 this is no partition disk. # ret 1 this is nand share type partition # ret 2 this is developkit type partition (maybe) if [ "$1" = "/dev/sda" -o "$1" = "/dev/sdb" ] ; then IsHavePartition $1 RET=$? [ "${RET}" -eq 1 ] TARGET_DEV=${1}1 [ "${RET}" -eq 2 ] TARGET_DEV=${1}4 [ "${RET}" -eq 0 ] TARGET_DEV=${1} else TARGET_DEV=$1 fi IsMounted ${TARGET_DEV} if [ $? = 1 ] ; then echo "${TARGET_DEV} is already mounted." return 1 fi if [ "$3" = "" ] ; then FS=xfs else FS=$3 fi if [ "$4" = "" ] ; then PERMISSION=777 else PERMISSION=$4 fi echo "Mounting ${TARGET_DEV} on $2 as a ${FS} file system." mount -t ${FS} ${TARGET_DEV} $2 case $? in 0) chmod ${PERMISSION} $2 echo "Success." ;; *) echo "Failed." return 1 ;; esac echo "" return 0 } MiconIntEnable(){ cat /proc/buffalo/miconint_en } CreateDevFile(){ DISK_DEV=$1 case ${DISK_DEV} in ${DISK1_DEV}) SCSI_MINOR_BASE=${SCSI1_MINOR_BASE} [ ! -e ${DISK_DEV} ] mknod ${DISK_DEV} b ${SCSI_MAJOR} ${SCSI_MINOR_BASE} ;; ${DISK2_DEV}) SCSI_MINOR_BASE=${SCSI2_MINOR_BASE} [ ! -e ${DISK_DEV} ] mknod ${DISK_DEV} b ${SCSI_MAJOR} ${SCSI_MINOR_BASE} ;; *) return -1 esac SCSI_MINOR=$((${SCSI_MINOR_BASE} + 1)) DEV_NO=1 while [ ${DEV_NO} -lt 8 ] do [ ! -e ${DISK_DEV}${DEV_NO} ] mknod ${DISK_DEV}${DEV_NO} b ${SCSI_MAJOR} ${SCSI_MINOR} DEV_NO=$((${DEV_NO} + 1)) SCSI_MINOR=$((${SCSI_MINOR} + 1)) done } lock_file(){ case $1 in check) [ -f "${LOCK}" ] echo "${THIS_SCRIPT} already runnign" return 1 ;; create) echo "${THIS_SCRIPT}" $2 ${LOCK} ;; delete) rm -f ${LOCK} ;; delete_log) rm -f ${LOCK}.log ;; *) ;; esac }
https://w.atwiki.jp/kakis/pages/1377.html
lib /// / 休み \ 13 seren klel lab \
https://w.atwiki.jp/248102/pages/133.html
チェザー【LIB】 【生い立ち】 初入村:#442113 四期生:2017/12/15 【プロフィール】 よくふぁみふぁみしてる。そしてふぁみふぁみもしてる。 フランドールアイコンをよく使っているから好きなのかもしれない。
https://w.atwiki.jp/directx11/pages/20.html
OBJファイルを読み込んで表示します。 http //neo-arcadia.seesaa.net/ こちらからモデルを借りてきて表示しています。 shader.hlsl //グローバル Texture2D g_texDecal register(t0); SamplerState g_samLinear register(s0); //グローバル cbuffer global_0 register(b0) { matrix g_mW;//ワールド行列 matrix g_mWVP; //ワールドから射影までの変換行列 float4 g_vLightDir; //ライトの方向ベクトル float4 g_vEye;//カメラ位置 }; cbuffer global_1 register(b1) { float4 g_Ambient=float4(0,0,0,0);//アンビエント光 float4 g_Diffuse=float4(1,0,0,0); //拡散反射(色) float4 g_Specular=float4(1,1,1,1);//鏡面反射 }; //バーテックスバッファー出力構造体 struct VS_OUTPUT { float4 Pos SV_POSITION; float4 Color COLOR0; float3 Light TEXCOORD0; float3 Normal TEXCOORD1; float3 EyeVector TEXCOORD2; float2 Tex TEXCOORD3; }; // //バーテックスシェーダー // VS_OUTPUT VS( float4 Pos POSITION ,float4 Norm NORMAL,float2 Tex TEXCOORD) { VS_OUTPUT output = (VS_OUTPUT)0; //射影変換(ワールド→ビュー→プロジェクション) //法線をワールド空間に output.Normal=mul(Norm, g_mW); output.Pos=mul(Pos,g_mWVP); //ライト方向 output.Light=g_vLightDir; //視線ベクトル float3 PosWorld = normalize(output.Pos); output.EyeVector = g_vEye - PosWorld; float3 Normal = normalize(output.Normal); float3 LightDir = normalize(output.Light); float3 ViewDir = normalize(output.EyeVector); float4 NL = saturate(dot(Normal, LightDir)); float3 Reflect = normalize(2 * NL * Normal - LightDir); float4 specular = pow(saturate(dot(Reflect, ViewDir)), 4); output.Color= g_Diffuse * NL + specular*g_Specular; //テクスチャー座標 output.Tex=Tex; return output; } // //ピクセルシェーダー // float4 PS( VS_OUTPUT input ) SV_Target { float4 color=g_texDecal.Sample( g_samLinear, input.Tex ); color+=input.Color; return color; } main.cpp #pragma comment(lib, d3d11.lib ) #pragma comment(lib, d3dx11.lib ) #pragma comment(lib, d3dx10.lib ) #pragma comment(lib, d3dCompiler.lib ) #include stdio.h #include vector #include d3dx11.h #include d3dx10.h #include d3dCompiler.h #define FILE_NAME axel.obj using namespace std; //安全に解放する #define SAFE_RELEASE(x) if(x){x- Release(); x=NULL;} //定数定義 #define WINDOW_WIDTH 320 //ウィンドウ幅 #define WINDOW_HEIGHT 240 //ウィンドウ高さ //グローバル変数 HWND hWnd=NULL; ID3D11Device* Device = NULL; //デバイス ID3D11DeviceContext* DeviceContext=NULL; //デバイスコンテキスト IDXGISwapChain* SwapChain = NULL; //スワップチェイン ID3D11RenderTargetView* RenderTargetView = NULL; //レンダーターゲットビュー ID3D11DepthStencilView* DepthStencilView = NULL; ID3D11Texture2D* DepthStencil = NULL; ID3D11InputLayout* VertexLayout=NULL; ID3D11VertexShader* VertexShader=NULL;//頂点シェーダー ID3D11PixelShader* PixelShader=NULL;//ピクセルシェーダー ID3D11Buffer* ConstantBuffer[2];//コンスタントバッファ D3DXVECTOR3 LightDir(1,1,-1);//ライト方向 ID3D11SamplerState* SampleLinear=NULL;//テクスチャーのサンプラー ID3D11ShaderResourceView* Texture=NULL;//テクスチャー //シェーダーに渡す値 struct SHADER_GLOBAL0 { D3DXMATRIX mW;//ワールド行列 D3DXMATRIX mWVP;//ワールドから射影までの変換行列 D3DXVECTOR4 vLightDir;//ライト方向 D3DXVECTOR4 vEye;//カメラ位置 }; struct SHADER_GLOBAL1 { D3DXVECTOR4 vAmbient;//アンビエント D3DXVECTOR4 vDiffuse;//ディフューズ D3DXVECTOR4 vSpecular;//鏡面反射 }; //マテリアル構造体 struct MATERIAL { CHAR Name[255]; D3DXVECTOR4 Ka;//アンビエント D3DXVECTOR4 Kd;//ディフューズ D3DXVECTOR4 Ks;//スペキュラー CHAR TextureName[255];//テクスチャファイル名 ID3D11ShaderResourceView* pTexture;//テクスチャデータ DWORD MaxFace;//ポリゴン数 }mat; //頂点構造体 struct VERTEX { D3DXVECTOR3 Pos;//位置 D3DXVECTOR3 Normal;//法線 D3DXVECTOR2 UV;//UV }vert; //.OBJファイルクラス class OBJ{ protected vector MATERIAL Material;//マテリアル vector VERTEX Vertex;//頂点構造体 ID3D11Buffer* VertexBuffer;//頂点バッファ ID3D11Buffer** IndexBuffer;//インデックスバッファ HRESULT LoadMaterialFromFile(LPSTR FileName);//マテリアルファイル読み込み public void Draw();//描画 HRESULT Load(LPSTR FileName);//読み込み }; OBJ obj; //メッシュの描画 void OBJ Draw() { //バーテックスバッファをセット UINT stride = sizeof( VERTEX ); UINT offset = 0; DeviceContext- IASetVertexBuffers( 0, 1, VertexBuffer, stride, offset ); //マテリアルの数だけ、それぞれのマテリアルのインデックスバッファを描画 for(DWORD i=0;i Material.size();i++) { //使用されていないマテリアル対策 if(Material[i].MaxFace==0) { continue; } //インデックスバッファをセット DeviceContext- IASetIndexBuffer(IndexBuffer[i], DXGI_FORMAT_R32_UINT, 0 ); //プリミティブ・トポロジーをセット DeviceContext- IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); //マテリアルの各要素をシェーダーに渡す D3D11_MAPPED_SUBRESOURCE pData; if( SUCCEEDED( DeviceContext- Map( ConstantBuffer[1],0, D3D11_MAP_WRITE_DISCARD, 0, pData ) ) ) { SHADER_GLOBAL1 sg; sg.vAmbient=Material[i].Ka; sg.vDiffuse=Material[i].Kd; sg.vSpecular=Material[i].Ks; memcpy_s( pData.pData, pData.RowPitch, (void*) sg, sizeof( SHADER_GLOBAL1 ) ); DeviceContext- Unmap( ConstantBuffer[1], 0 ); } DeviceContext- VSSetConstantBuffers(1,1, ConstantBuffer[1] ); DeviceContext- PSSetConstantBuffers(1,1, ConstantBuffer[1] ); //テクスチャをシェーダーに渡す if(Material[i].TextureName[0] != NULL) { DeviceContext- PSSetSamplers(0,1, SampleLinear); DeviceContext- PSSetShaderResources(0,1, Material[i].pTexture); } DeviceContext- DrawIndexed(Material[i].MaxFace*3 , 0 ,0); } } //マテリアルファイルを読み込む関数 HRESULT OBJ LoadMaterialFromFile(LPSTR FileName) { FILE* fp=NULL; fopen_s( fp,FileName, rt ); char key[255]={0}; bool flag=false; D3DXVECTOR4 v(0,0,0,0); fseek(fp,SEEK_SET,0); while(!feof(fp)) { //キーワード読み込み fscanf_s(fp, %s ,key,sizeof(key)); //マテリアル名 if(strcmp(key, newmtl )==0) { if(flag)Material.push_back(mat); flag=true; fscanf_s(fp, %s ,key,sizeof(key)); strcpy_s(mat.Name,key); } //Ka アンビエント if(strcmp(key, Ka )==0) { fscanf_s(fp, %f %f %f , v.x, v.y, v.z); mat.Ka=v; } //Kd ディフューズ if(strcmp(key, Kd )==0) { fscanf_s(fp, %f %f %f , v.x, v.y, v.z); mat.Kd=v; } //Ks スペキュラー if(strcmp(key, Ks )==0) { fscanf_s(fp, %f %f %f , v.x, v.y, v.z); mat.Ks=v; } //map_Kd テクスチャ if(strcmp(key, map_Kd )==0) { fscanf_s(fp, %s , mat.TextureName,sizeof(mat.TextureName)); //テクスチャを作成 if(FAILED(D3DX11CreateShaderResourceViewFromFileA( Device, mat.TextureName, NULL, NULL, mat.pTexture, NULL ))) { return E_FAIL; } } } fclose(fp); if(flag)Material.push_back(mat); return S_OK; } //OBJファイルからメッシュに必要な情報を読み込む HRESULT OBJ Load(LPSTR FileName) { //一時代入用 D3DXVECTOR3 vec3d; D3DXVECTOR2 vec2d; vector D3DXVECTOR3 Pos; vector D3DXVECTOR3 Normal; vector D3DXVECTOR2 UV; vector int FaceIndex; int v1=0,v2=0,v3=0; int vn1=0,vn2=0,vn3=0; int vt1=0,vt2=0,vt3=0; DWORD dwFCount=0;//読み込みカウンタ char key[255]={0}; //OBJファイルを開いて内容を読み込む FILE* fp=NULL; fopen_s( fp,FileName, rt ); //読み込み fseek(fp,SEEK_SET,0); while(!feof(fp)) { //キーワード ZeroMemory(key,sizeof(key)); fscanf_s(fp, %s ,key,sizeof(key)); //マテリアル if(strcmp(key, mtllib )==0) { fscanf_s(fp, %s ,key,sizeof(key)); LoadMaterialFromFile(key); } //頂点 if(strcmp(key, v )==0) { fscanf_s(fp, %f %f %f , vec3d.x, vec3d.y, vec3d.z); Pos.push_back(vec3d); Vertex.push_back(vert); } //法線 if(strcmp(key, vn )==0) { fscanf_s(fp, %f %f %f , vec3d.x, vec3d.y, vec3d.z); Normal.push_back(vec3d); } //テクスチャ if(strcmp(key, vt )==0) { fscanf_s(fp, %f %f , vec2d.x, vec2d.y); UV.push_back(-vec2d); } //フェイス if(strcmp(key, f )==0) { FaceIndex.push_back(0); } } //マテリアルの数だけインデックスバッファを作成 IndexBuffer=new ID3D11Buffer*[Material.size()]; bool boFlag=false; for(DWORD i=0;i Material.size();i++) { fseek(fp,SEEK_SET,0); dwFCount=0; while(!feof(fp)) { //キーワード ZeroMemory(key,sizeof(key)); fscanf_s(fp, %s ,key,sizeof(key)); //フェイス 読み込み→頂点インデックスに if(strcmp(key, usemtl )==0) { fscanf_s(fp, %s ,key,sizeof(key)); if(strcmp(key,Material[i].Name)==0) { boFlag=true; } else { boFlag=false; } } if(strcmp(key, f )==0 boFlag==true) { if(Material[i].pTexture!=NULL)//テクスチャーありサーフェイス { fscanf_s(fp, %d/%d/%d %d/%d/%d %d/%d/%d , v1, vt1, vn1, v2, vt2, vn2, v3, vt3, vn3); } else//テクスチャー無しサーフェイス { fscanf_s(fp, %d//%d %d//%d %d//%d , v1, vn1, v2, vn2, v3, vn3); } FaceIndex[dwFCount*3]=v1-1; FaceIndex[dwFCount*3+1]=v2-1; FaceIndex[dwFCount*3+2]=v3-1; dwFCount++; //頂点構造体に代入 Vertex[v1-1].Pos=Pos[v1-1]; Vertex[v1-1].Normal=Normal[vn1-1]; Vertex[v1-1].UV=UV[vt1-1]; Vertex[v2-1].Pos=Pos[v2-1]; Vertex[v2-1].Normal=Normal[vn2-1]; Vertex[v2-1].UV=UV[vt2-1]; Vertex[v3-1].Pos=Pos[v3-1]; Vertex[v3-1].Normal=Normal[vn3-1]; Vertex[v3-1].UV=UV[vt3-1]; } } if(dwFCount==0)//使用されていないマテリアル対策 { IndexBuffer[i]=NULL; continue; } //インデックスバッファを作成 D3D11_BUFFER_DESC bd; bd.Usage = D3D11_USAGE_DEFAULT; bd.ByteWidth = sizeof( int ) * dwFCount * 3; bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA InitData; InitData.pSysMem = FaceIndex[0]; InitData.SysMemPitch=0; InitData.SysMemSlicePitch=0; if( FAILED( Device- CreateBuffer( bd, InitData, IndexBuffer[i] ) ) )return FALSE; Material[i].MaxFace=dwFCount; } FaceIndex.clear(); fclose(fp); //バーテックスバッファを作成 D3D11_BUFFER_DESC bd; bd.Usage = D3D11_USAGE_DEFAULT; bd.ByteWidth = sizeof( VERTEX ) *Vertex.size(); bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; bd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA InitData; InitData.pSysMem = Vertex[0]; if( FAILED( Device- CreateBuffer( bd, InitData, VertexBuffer ) ) )return FALSE; Pos.clear(); Normal.clear(); UV.clear(); Vertex.clear(); return S_OK; } //Direct3Dの初期化関数 HRESULT InitD3D(HWND hWnd) { // デバイスとスワップチェーンの作成 DXGI_SWAP_CHAIN_DESC sd; ZeroMemory( sd, sizeof(sd) ); sd.BufferCount = 1; //バックバッファの数 sd.BufferDesc.Width = WINDOW_WIDTH; //バッファの幅 sd.BufferDesc.Height = WINDOW_HEIGHT; //バッファの高さ sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; //バッファのフォーマット sd.BufferDesc.RefreshRate.Numerator = 60; //リフレッシュレート sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; D3D_FEATURE_LEVEL FeatureLevel = D3D_FEATURE_LEVEL_11_0; D3D_FEATURE_LEVEL* pFeatureLevel = NULL; if( FAILED( D3D11CreateDeviceAndSwapChain( NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,0, FeatureLevel,1,D3D11_SDK_VERSION, sd, SwapChain, Device ,NULL, DeviceContext) ) ) { return FALSE; } //レンダーターゲットビューの作成 ID3D11Texture2D *BackBuffer; SwapChain- GetBuffer( 0, __uuidof( ID3D11Texture2D ),(LPVOID*) BackBuffer); Device- CreateRenderTargetView( BackBuffer, NULL, RenderTargetView ); SAFE_RELEASE(BackBuffer); //深度ステンシルビューの作成 D3D11_TEXTURE2D_DESC descDepth; descDepth.Width = WINDOW_WIDTH; descDepth.Height = WINDOW_HEIGHT; descDepth.MipLevels = 1; descDepth.ArraySize = 1; descDepth.Format = DXGI_FORMAT_D32_FLOAT; descDepth.SampleDesc.Count = 1; descDepth.SampleDesc.Quality = 0; descDepth.Usage = D3D11_USAGE_DEFAULT; descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; Device- CreateTexture2D( descDepth, NULL, DepthStencil ); Device- CreateDepthStencilView( DepthStencil, NULL, DepthStencilView ); //レンダーターゲットビューと深度ステンシルビューをパイプラインにバインド DeviceContext- OMSetRenderTargets(1, RenderTargetView,DepthStencilView); //ビューポートの設定 D3D11_VIEWPORT vp; vp.Width = WINDOW_WIDTH; vp.Height = WINDOW_HEIGHT; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; DeviceContext- RSSetViewports( 1, vp ); //hlslファイル読み込み ID3DBlob *pCompiledShader=NULL; ID3DBlob *pErrors=NULL; //ブロブから頂点シェーダー作成 if(FAILED(D3DX11CompileFromFile(L shader.hlsl ,NULL,NULL, VS , vs_5_0 ,0,0,NULL, pCompiledShader, pErrors,NULL))) { MessageBox(0,L 頂点シェーダー読み込み失敗 ,NULL,MB_OK); return E_FAIL; } SAFE_RELEASE(pErrors); if(FAILED(Device- CreateVertexShader(pCompiledShader- GetBufferPointer(),pCompiledShader- GetBufferSize(),NULL, VertexShader))) { SAFE_RELEASE(pCompiledShader); MessageBox(0,L 頂点シェーダー作成失敗 ,NULL,MB_OK); return E_FAIL; } //頂点インプットレイアウトを定義 D3D11_INPUT_ELEMENT_DESC layout[] = { { POSITION , 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { NORMAL , 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { TEXCOORD , 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; UINT numElements = sizeof(layout)/sizeof(layout[0]); //頂点インプットレイアウトを作成 if( FAILED( Device- CreateInputLayout( layout, numElements, pCompiledShader- GetBufferPointer(), pCompiledShader- GetBufferSize(), VertexLayout ) ) ) return FALSE; //頂点インプットレイアウトをセット DeviceContext- IASetInputLayout( VertexLayout ); //ブロブからピクセルシェーダー作成 if(FAILED(D3DX11CompileFromFile(L shader.hlsl ,NULL,NULL, PS , ps_5_0 ,0,0,NULL, pCompiledShader, pErrors,NULL))) { MessageBox(0,L ピクセルシェーダー読み込み失敗 ,NULL,MB_OK); return E_FAIL; } SAFE_RELEASE(pErrors); if(FAILED(Device- CreatePixelShader(pCompiledShader- GetBufferPointer(),pCompiledShader- GetBufferSize(),NULL, PixelShader))) { SAFE_RELEASE(pCompiledShader); MessageBox(0,L ピクセルシェーダー作成失敗 ,NULL,MB_OK); return E_FAIL; } SAFE_RELEASE(pCompiledShader); //ラスタライズ設定 D3D11_RASTERIZER_DESC rdc; ZeroMemory( rdc,sizeof(rdc)); rdc.CullMode=D3D11_CULL_NONE; rdc.FillMode=D3D11_FILL_SOLID; ID3D11RasterizerState* pIr=NULL; Device- CreateRasterizerState( rdc, pIr); DeviceContext- RSSetState(pIr); SAFE_RELEASE(pIr); //コンスタントバッファー作成 ここでは変換行列渡し用 D3D11_BUFFER_DESC cb; cb.BindFlags= D3D11_BIND_CONSTANT_BUFFER; cb.ByteWidth= sizeof( SHADER_GLOBAL0 ); cb.CPUAccessFlags=D3D11_CPU_ACCESS_WRITE; cb.MiscFlags =0; cb.StructureByteStride=0; cb.Usage=D3D11_USAGE_DYNAMIC; if( FAILED(Device- CreateBuffer( cb,NULL, ConstantBuffer[0]))) { return E_FAIL; } //コンスタントバッファー作成 マテリアル渡し用 cb.BindFlags= D3D11_BIND_CONSTANT_BUFFER; cb.ByteWidth= sizeof( SHADER_GLOBAL1 ); cb.CPUAccessFlags=D3D11_CPU_ACCESS_WRITE; cb.MiscFlags =0; cb.StructureByteStride=0; cb.Usage=D3D11_USAGE_DYNAMIC; if( FAILED(Device- CreateBuffer( cb,NULL, ConstantBuffer[1]))) { return E_FAIL; } //テクスチャー用サンプラー作成 D3D11_SAMPLER_DESC SamDesc; ZeroMemory( SamDesc,sizeof(D3D11_SAMPLER_DESC)); SamDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; SamDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; SamDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; SamDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; Device- CreateSamplerState( SamDesc, SampleLinear); //OBJファイルからオリジナルメッシュを作成 obj.Load(FILE_NAME); return S_OK; } //レンダリング VOID Render() { float ClearColor[4] = {0,0,1,1 }; // クリア色作成 RGBAの順 DeviceContext- ClearRenderTargetView( RenderTargetView, ClearColor );//画面クリア DeviceContext- ClearDepthStencilView( DepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );//深度バッファクリア //変換行列作成 D3DXMATRIX mWorld; D3DXMATRIX mView; D3DXMATRIX mProj; //ワールド行列 static float angle=0; angle+=0.03f; D3DXMATRIX mRot; D3DXMatrixRotationY( mRot,(float)D3DXToRadian(angle)); mWorld=mRot; //ビュー行列 D3DXVECTOR3 Eye( 0.0f, 300.0f, -200.0f ); D3DXVECTOR3 At( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 Up( 0.0f, 1.0f, 0.0f ); D3DXMatrixLookAtLH( mView, Eye, At, Up ); //プロジェクション行列 D3DXMatrixPerspectiveFovLH( mProj, ( float )D3DX_PI/4 , (float)WINDOW_WIDTH / (float)WINDOW_HEIGHT, 0.1f, 1000.0f ); //ワールド・ビュー・プロジェクション行列をシェーダーに渡す DeviceContext- VSSetConstantBuffers(0,1, ConstantBuffer[0] ); D3D11_MAPPED_SUBRESOURCE pData; if( SUCCEEDED( DeviceContext- Map( ConstantBuffer[0], 0, D3D11_MAP_WRITE_DISCARD, 0, pData ) ) ) { SHADER_GLOBAL0 sg; sg.mW=mWorld; D3DXMatrixTranspose( sg.mW, sg.mW ); sg.mWVP=mWorld*mView*mProj; D3DXMatrixTranspose( sg.mWVP, sg.mWVP ); sg.vLightDir=D3DXVECTOR4(LightDir.x,LightDir.y,LightDir.z,0.0f); sg.vEye=D3DXVECTOR4(Eye.x,Eye.y,Eye.z,0); memcpy_s( pData.pData, pData.RowPitch, (void*) sg, sizeof( SHADER_GLOBAL0 ) ); DeviceContext- Unmap( ConstantBuffer[0], 0 ); } DeviceContext- VSSetConstantBuffers(0,1, ConstantBuffer[0] ); DeviceContext- PSSetConstantBuffers(0,1, ConstantBuffer[0] ); //使用するシェーダーの登録 DeviceContext- VSSetShader(VertexShader,NULL,0); DeviceContext- PSSetShader(PixelShader,NULL,0); //メッシュを描画 obj.Draw(); SwapChain- Present( 0, 0 );//フリップ } //終了時解放処理 VOID Cleanup() { SAFE_RELEASE(SampleLinear); SAFE_RELEASE(Texture); SAFE_RELEASE(DepthStencil); SAFE_RELEASE(DepthStencilView); SAFE_RELEASE(VertexShader); SAFE_RELEASE(PixelShader); SAFE_RELEASE(ConstantBuffer[0]); SAFE_RELEASE(ConstantBuffer[1]); SAFE_RELEASE(VertexLayout); SAFE_RELEASE(SwapChain); SAFE_RELEASE(RenderTargetView); SAFE_RELEASE(DeviceContext); SAFE_RELEASE(Device); } //メッセージプロシージャ LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_DESTROY //終了時 Cleanup(); PostQuitMessage(0); break; } return DefWindowProc (hWnd, msg, wParam, lParam); } //メイン関数 INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow) { //ウインドウクラスの登録 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L Window1 , NULL }; RegisterClassEx( wc ); //タイトルバーとウインドウ枠の分を含めてウインドウサイズを設定 RECT rect; SetRect( rect,0,0,WINDOW_WIDTH,WINDOW_HEIGHT); AdjustWindowRect( rect, WS_OVERLAPPEDWINDOW, FALSE); rect.right=rect.right-rect.left; rect.bottom=rect.bottom-rect.top; rect.top=0; rect.left=0; //ウインドウの生成 hWnd = CreateWindow( L Window1 , L OBJローダ , WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rect.right, rect.bottom, NULL, NULL, wc.hInstance, NULL ); MSG msg; ZeroMemory( msg,sizeof(msg)); //Direct3D初期化 if(SUCCEEDED(InitD3D(hWnd))) { //ウインドウ表示 ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); while(msg.message!=WM_QUIT) { if( PeekMessage( msg,NULL,0,0,PM_REMOVE)) { TranslateMessage( msg); DispatchMessage( msg); } else { Render(); } } } //終了 return 0; }
https://w.atwiki.jp/icsuimeil/pages/22.html
meil-lib ver0.5.6 http //ux.getuploader.com/meil_lib/download/4/meil-lib0.5.6.zip ver0.5.4 http //ux.getuploader.com/meil_lib/download/3/meil-lib0.5.4.zip ver0.5.3 http //ux.getuploader.com/meil_lib/download/2/meil-lib0.5.3.zip ver0.5.2 http //ux.getuploader.com/meil_lib/download/1/meil-lib0.5.2.zip ver情報 0.5.2 cutStatus関数リプライ処理ループ時の不具合修正 0.5.1 preg_replace_custom関数追加 cutStatus関数追加 0.4.1 mb_preg_match_custom関数追加 mb_preg_match_all_custom関数追加 0.3.1 mb_str_split_custom関数追加 splitStatus関数追加 0.2 cutTweet関数追加 0.1 初期リリース makeTextRand関数追加 checkStatus関数追加
https://w.atwiki.jp/bokuyo/pages/45.html
ランタイムライブラリ ってなーに? ランタイムタイブラリ VisualC++での設定について プロパティ C/C++ コード生成 ランタイムライブラリ たいていReleseするとき、よく「/MT」使うよね。/MTじゃないとVC++が入ってない環境で動かなかったり。 /MD 通常のアプリケーション時の設定。 「_MT」と「_DLL」の2つを定義するから,「MD」 「_MT」=マルチスレッド対応バージョンのランタイムライブラリを使用 「_DLL」=DLL対応バージョンのランタイムライブラリを使用 MSVCRT.libと静的にリンクする設定。 しかし!!気をつけなければいけないのは、MSVCRT.libの中でMSVCR80.DLLを実行時に呼び出すので、この設定でビルドした場合、MSVCR80.DLLが実行時に必要になってくる。 VC++を入れてる人はMSVCR80.DLLが付いてくるので特に関係ないが、ほとんどの人はMSVCR80.DLLを持ってない(?)ので、この設定でビルドしたアプリケーションは実行できない。 /MDd 「_MT」と「_DLL」と「_DEBUG」を定義するから「MDd」(DEBUGが小文字d) /MDとほぼ同じだけど、「MSVCRT.lib」じゃなく「MSVCRTD.lib」を静的にリンクさせる。MSVCRTD.libの「D」はDEBUGのデー。 /MT 通常のアプリケーション時の設定。 「_MT」=マルチスレッド対応のスタティックバージョンのランタイムライブラリを使用 MSVCRT.libではなく、LIBCMT.libを.objファイルに挿入する。 /MTd /MTに「_DEBUG」を加えたもの。 「LIBCMT.lib」ではなく「LIBCMTD.lib」(~D.lib:_DEBUG用のライブラリ)を使用する。 /LD DLLを作成する時の設定。 /MTをデフォルトで指定してるらしいけど、/MDを指定することもできる。 詳しくは MSDN - /MD、/MT、/LD (ランタイム ライブラリの使用) にて VS2010から使用されなくなりました。 /LDd /LDのデバッグ用。 VS2010から使用されなくなりました。 関連項目 msvcr 参考文献 MSDN - /MD、/MT、/LD (ランタイム ライブラリの使用) MSDN - C ランタイム ライブラリ MSDN - /NODEFAULTLIB (ライブラリを無視する) .
https://w.atwiki.jp/abwiki/pages/452.html
前回は素のwaveファイルお再生しました。 これを使えばほかのものでも応用ができます。 今回はmp3をやります。 mp3はデコーダやプレイやがあって今さらですけど、 ABでもできるんですよ。 今回使うのは定番のmpglib.dllです。 mpglib.dllのある場所http //mpesch3.de1.cc/misc.html こいつはABから使うことを想定していないしドキュメントも不親切です だから元となったmpg123というライブラリも調べてみるといいかもしれませんね。 まずこのDLLは3つの関数しかないので、簡単ですけど、便利な昨日がないので 自分で作ります。 ID3V2も自力で読み飛ばさないといけません。 abmpglib.abp Const AUDIOBUFSIZE = 16384Const SBLIMIT = 32Const SSLIMIT = 18Const SCALE_BLOCK = 12 /* Layer 2 */Const MPG_MD_STEREO = 0Const MPG_MD_JOINT_STEREO = 1Const MPG_MD_DUAL_CHANNEL = 2Const MPG_MD_MONO = 3Const MAXFRAMESIZE = 1792Const MP3_ERR = -1Const MP3_OK = 0Const MP3_NEED_MORE = 1Type al_tablebits As Wordd As WordEnd TypeType framestereo As Longjsbound As Longsingle As Longlsf As Longmpeg25 As Longheader_change As Longlay As Longerror_protection As Longbitrate_index As Longsampling_frequency As Longpadding As Longextension As Longmode As Longmode_ext As Longcopyright As Longoriginal As Longemphasis As Longframesize As Long /* computed framesize */II_sblimit As Long /* Layer 2 */alloc As *al_table /* Layer 2 */do_layer As VoidPtr /* Layer 2 */End TypeType mpglib_bufpnt As *Bytesize As Longpos As Longpnext As *mpglib_bufprev As *mpglib_bufEnd TypeType framebufbuf As *mpglib_bufpos As Longpnext As *frameprev As *frameEnd TypeType mpstrhead As *mpglib_buftail As *mpglib_bufbsize As Longframesize As Longfsizeold As Longfr As framebsspace[ELM(2*(MAXFRAMESIZE+512))] As Byte /* MAXFRAMESIZE */hybrid_block[ELM(2*2*SBLIMIT*SSLIMIT)] As Singlehybrid_blc[ELM(2)] As Longheader As DWord bsnum As Longsynth_buffs[ELM(2*2* h110)] As Singlesynth_bo As LongEnd TypeType ID3V2ID3[2] As Bytemajorversion As Byterevision As Byteflag As Bytesize[3] As ByteEnd TypeDeclare Function InitMP3 CDECL Lib"mpglib.dll" Alias "_InitMP3" (mp As *mpstr) As LongDeclare Sub ExitMP3 CDECL Lib"mpglib.dll" Alias "_ExitMP3" (mp As *mpstr)Declare Function decodeMP3 CDECL Lib"mpglib.dll" Alias "_decodeMP3" (mp As *mpstr, inmemory As *Byte, inmemsize As Long, outmemory As *Byte, outmemsize As Long, done As *Long) As LongDim br_tbl[1,14] = [[ 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320],[ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160]] As LongDim rate_tbl[9] = [44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000, 0] As Long'ID3V2のサイズを詰めるFunction unpack_sint28 (ptr As *Byte) As DWordDim value As DWordIf (ptr[0] And h80) Then Exit Functionvalue = value Or (ptr[0] And h7f)value = (value 7) Or (ptr[1] And h7f)value = (value 7) Or (ptr[2] And h7f)value = (value 7) Or (ptr[3] And h7f)unpack_sint28 = valueEnd FunctionType ABMP3DEC_CTXmp As mpstrbuf[AUDIOBUFSIZE] As BytehF As HANDLErate As Longch As Longpcmb As DWordstartpos As DWordmore As Longstatus As LongEnd TypeDim mc As ABMP3DEC_CTX'mp3ファイルを開いてデコード準備Function OpenMp3(mp3file As *Byte) As LongDim size As LongDim out[8192] As ByteDim len As LongDim ret As LongDim id3 As ID3V2If mc.status = TRUE Then Exit FunctionZeroMemory(VarPtr(mc), SizeOf(ABMP3DEC_CTX))mc.hF = CreateFile(mp3file, GENERIC_READ, FILE_SHARE_READ, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)If mc.hF = INVALID_HANDLE_VALUE Then Exit Function'ID3V2ReadFile(mc.hF, VarPtr(id3), SizeOf(ID3V2), VarPtr(len), ByVal 0)If strstr(id3.ID3, "ID3") ThenIf Not (id3.size[0] And h80) Then mc.startpos = unpack_sint28(id3.size)+10 End IfSetFilePointer(mc.hF, mc.startpos, 0, FILE_BEGIN)InitMP3(VarPtr(mc.mp))'一度読み込んでフォーマットを取得If ReadFile(mc.hF, mc.buf, 1024, VarPtr(len), ByVal 0) = FALSE Or len = 0 Then'読み込みエラーEnd Ifret = decodeMP3(VarPtr(mc.mp), mc.buf, len, out, 8192, VarPtr(size))If ret MP3_OK Then'デコードエラーEnd Ifmc.rate = rate_tbl[mc.mp.fr.sampling_frequency]mc.ch = mc.mp.fr.stereo'リセットSetFilePointer(mc.hF, mc.startpos, 0, FILE_BEGIN)ExitMP3(VarPtr(mc.mp))InitMP3(VarPtr(mc.mp))mc.status = TRUEOpenMp3 = TRUEEnd Function'サンプリングレート、チャンネル数を得るFunction GetFormat(rate As *Long, ch As *Long) As LongIf mc.status = FALSE Then Exit FunctionSetDWord(rate, mc.rate)SetDWord(ch, mc.ch)End Function'デコードし、そのサイズを返す。Function ReadMp3(pcm As *Byte, buflen As Long) As DWordDim pos As DWordDim len As DWordDim siz As DWordDim ret As LongIf mc.status = FALSE Then Exit Functionpos = 0siz = 0Do If mc.more = FALSE Thenret = ReadFile(mc.hF, mc.buf, 16384, VarPtr(len), ByVal 0)If ret = FALSE Or len = 0 Then *JUMPret = decodeMP3(VarPtr(mc.mp), mc.buf, len, VarPtr(pcm[pos]), 8192, VarPtr(siz))If ret = MP3_OK Then mc.more = TRUEEnd IfWhile (ret = MP3_OK)pos = pos + sizIf pos+8192 buflen Then *JUMPret = decodeMP3(VarPtr(mc.mp), NULL, 0, VarPtr(pcm[pos]), 8192, VarPtr(siz))Wendmc.more = FALSE'次に読み込みが必要Loop While pos+8192 buflen*JUMPReadMp3 = posmc.pcmb = mc.pcmb + posEnd Function'終わりFunction CloseMp3() As LongIf mc.status = FALSE Then Exit FunctionCloseHandle(mc.hF)ExitMP3(VarPtr(mc.mp))mc.status = FALSEEnd Function つぎに再生部 #include api_mmsys.sbp #include "abmpglib.abp"Declare Function waveOutOpen Lib "winmm" (phwo As *HWAVEOUT, uDeviceID As DWord, pwfx As *WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As MMRESULTDeclare Function waveOutClose Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutPrepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutUnprepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutWrite Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutPause Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutRestart Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutReset Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutGetPosition Lib "winmm" (hwo As HWAVEOUT, pmmt As *MMTIME, cbmmt As DWord) As MMRESULTDeclare Function MulDiv Lib "kernel32" (nNumber As Long, nNumerator As Long, nDenominator As Long) As LongConst WAVE_MAPPER = (-1)Const CALLBACK_FUNCTION = H00030000lConst WOM_OPEN = H3BBConst WOM_CLOSE = H3BCConst WOM_DONE = H3BDConst WHDR_DONE = H00000001Const WHDR_PREPARED = H00000002Const WHDR_BEGINLOOP = H00000004Const WHDR_ENDLOOP = H00000008Const WHDR_INQUEUE = H00000010Const TIME_MS = H0001Const TIME_SAMPLES = H0002Const TIME_BYTES = H0004Const TIME_SMPTE = H0008Const TIME_MIDI = H0010Const TIME_TICKS = H0020TypeDef MMRESULT = DWordTypedef HWAVEOUT = VoidPtrType WAVEHDR lpData As *Byte dwBufferLength As DWord dwBytesRecorded As DWord dwUser As DWord dwFlags As DWord dwLoops As DWord lpNext As *WAVEHDR reserved As *DWord End TypeType MMTIMEwType As DWordu As DWordu2 As DWordEnd TypeClass Mp3PlayerPrivatebuffer[2] As *Bytehwo As HWAVEOUTwfe As WAVEFORMATEXswitch As LongFunction GetMp3Header() As LongDim head[3] As ByteDim r As DWordDim c As DWordGetFormat(VarPtr(r), VarPtr(c))wfe.wFormatTag = 1wfe.nChannels = cwfe.nSamplesPerSec = rwfe.wBitsPerSample = 16wfe.cbSize = Sizeof(WAVEFORMATEX)wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample/8wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlignGetMp3Header = 1End FunctionSub waveOutProc(hwo As HWAVEOUT, uMsg As DWord, dwInstance As *DWord, dwParam1 As DWord, dwParam2 As DWord)Dim x As *Mp3Playerx = dwInstanceSelect Case uMsgCase WOM_CLOSECase WOM_DONEx- wh[1].dwUser = x- wh[1].dwUser - 1If x- wh[0].dwUser = 0 Then x- read(hwo)Case WOM_OPENEnd SelectEnd SubPublicwh[2] As WAVEHDRSub read(hwo As HWAVEOUT)Dim r As DWordIf hwo = NULL Or wh[0].dwUser = 1 Or wh[1].dwUser 1 Then Exit SubwaveOutUnprepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))r = ReadMp3(buffer[switch], wfe.nAvgBytesPerSec)wh[switch].lpData = buffer[switch]wh[switch].dwBufferLength = rIf r = 0 Then wh[0].dwUser = 1'これ以上再生しませんwaveOutPrepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))waveOutWrite(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))wh[1].dwUser = wh[1].dwUser + 1switch = switch + 1If switch = 2 Then switch = 0End SubFunction play(infile As *Byte) As LongIf hwo NULL Then Exit FunctionIf OpenMp3(infile) = FALSE Then Exit FunctionIf GetMp3Header() = 0 ThenCloseMp3()Exit FunctionEnd Ifbuffer[0] = malloc(wfe.nAvgBytesPerSec)buffer[1] = malloc(wfe.nAvgBytesPerSec)waveOutOpen( VarPtr(hwo), WAVE_MAPPER, VarPtr(wfe), AddressOf(waveOutProc) ,VarPtr(this), CALLBACK_FUNCTION)read(hwo)Sleep(500)read(hwo)play = 1End FunctionSub stop() As LongIf hwo = NULL Then Exit Subwh[0].dwUser = 1waveOutReset(hwo)While wh[1].dwUser 0Sleep(1)WendwaveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))waveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))free(buffer[0])free(buffer[1])waveOutClose(hwo)CloseMp3()hwo = NULLEnd SubFunction state(t As *DWord) As Longstate = wh[1].dwUserIf t = NULL Then Exit FunctionDim mmt As MMTIMEmmt.wType = TIME_SAMPLESwaveOutGetPosition(hwo, VarPtr(mmt), SizeOf(MMTIME))SetDWord(t,MulDiv(mmt.u , 1000, wfe.nSamplesPerSec))End FunctionEnd Class#define SELFTEST#ifdef SELFTEST#N88BASICDim wp As Mp3PlayerDim time As DWordPrint "再生"wp.play("test.mp2")While wp.state(VarPtr(time))Locate 4,1Print time\1000;"sec"Sleep(1000)Wendwp.stop()Print "停止"#endif ファイル名は好きに変えるようにして、 美しい音楽が聴こえてくるはずです。