--------=========================----------------  
        Goldenspdier[G-Spider 月窟]
--------=========================---------------- 


    于2010年4月4日星期天,八小时未进米食,一气呵成,纯Win32汇编环境(masm32 V10.0),
参考其中自带的example(LCD界面设计2000 by Thomas Bleeker [exagone])
在几十KB的代码中游走实属不易,愿为看雪做一点贡献。 完成之后心情超好啦~~~~

使用说明:(初始版本)
  1.点选menu弹出文件窗口,得到音频文件[支持mp3格式]
  2.点play播放(注意不要重复点击该按钮,否则不能保证流畅播放)
  3.调节音量有+,-按钮
  4.部分功能有待完善

更新说明:  (更新版本,已上传)
  1.接口实现上有很大调整,有助于扩展成支持多种格式。
  2.支持mp3格式,新增对.FLAC无损音频文件的支持,以满足音乐发烧友对音质的要求

使用说明:
  1.点选menu弹出文件窗口,得到mp3,flac音频文件
  2.点play播放(注意不要重复点击该按钮,否则不能保证流畅播放)
  3.调节音量有+,-按钮
  4.部分功能有待完善

上传的附件 lcd.rar

  • 标 题:多种音频文件格式的选择问题
  • 作 者:gldnspider
  • 时 间:2010-04-07 11:55:31

之前并没有考虑要扩展支持多种音频格式,对于多种格式支持时出现了小麻烦。
开始时,准备用In_Module中的
int   (*IsOurFile)(char   *szFile); //   检查文件格式 
发现不好用,无论与否好像都返回0,这样我就没办法了,并且占CPU很多。
   于是自己搞个扩展名识别也行的,如对于.mp3和.flac格式分别调用各自的模块就搞定了。
所以要实现扩展名识别。
------------------------------------
PathFindExtension  //得到文件扩展名api

Searches a path for an extension. 

LPTSTR PathFindExtension(
    LPCTSTR pPath  //输入参数是一个路径地址,返回扩展名首址;
      //如"D:\masm32\lcd\lcd.asm",则可返回".asm"的首址
    );      //汇编中返回值在eax中

Parameters
pPath 
[in] Pointer to a null-terminated string of maximum length MAX_PATH that 
contains the path that contains the extension for which to search. 
Return Values
Returns the address of the "." preceding the extension within pPath
 if an extension is found, or the address of the trailing NULL character otherwise. 

Requirements 
  Version 4.71 and later of Shlwapi.dll

  Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 4.0 or later). 
  Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 4.0 or later). 
  Header: Declared in Shlwapi.h. //masm32中用include Shlwapi.inc
  Import Library: Shlwapi.lib. 

------------------------------------
功能实现如下:
.data
stOpenFileName  OPENFILENAME     <?>
szTitleSave  db  "Open MUSIC file...",0
szExt    db  '*.*',0
szMp3    db  '.mp3',0
szFilter  db  'MUSIC Files(*.mp3,*.flac)',0,'*.*',0,0

.data?
szBuffer  db  256   dup  (?)
.........
;*******************************************************************
//利用托此控件来得到我们所要的路径地址(在szBuffer缓存中)
_GetFileName  proc  

    mov  stOpenFileName.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
    mov  stOpenFileName.lStructSize,SIZEOF stOpenFileName
    mov  eax,hDlg
    mov  stOpenFileName.hWndOwner,eax
    mov  stOpenFileName.lpstrFilter,offset szFilter  ;扩展名
    mov  stOpenFileName.lpstrFile,offset szBuffer  ;文件名路径缓冲
    mov  stOpenFileName.nMaxFile,255      ;文件名缓冲长度
    mov  stOpenFileName.lpstrInitialDir,0
    mov  stOpenFileName.lpstrTitle,offset szTitleSave
    mov  stOpenFileName.lpstrDefExt,offset szExt
    invoke  GetOpenFileName,offset stOpenFileName
    .if  eax == FALSE
      ret
    .endif
    
    
    ret

_GetFileName  endp
;********************************************************************

invoke   _GetFileName
invoke  PathFindExtension,offset szBuffer//得到扩展名地址(返回值在eax中)
invoke  lstrcmpi, offset szMp3, eax  //进行比较两个扩展名字符串是否相等(如果相等则返回0)
.if  eax==0   
  ........//做出相应动作