﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Cpper-随笔分类-音频视频</title><link>http://www.cppblog.com/gaimor/category/16272.html</link><description>C/C++高级工程师
Android高级软件工程师
IT集成工程师
音频工程师
熟悉c,c++,java,c#,py,js,asp等多种语言
程序猿</description><language>zh-cn</language><lastBuildDate>Thu, 19 Sep 2019 02:15:10 GMT</lastBuildDate><pubDate>Thu, 19 Sep 2019 02:15:10 GMT</pubDate><ttl>60</ttl><item><title>ffmpeg av_seek_frame</title><link>http://www.cppblog.com/gaimor/archive/2019/09/19/216840.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 19 Sep 2019 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2019/09/19/216840.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/216840.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2019/09/19/216840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/216840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/216840.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #800000; ">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;result&nbsp;=&nbsp;av_seek_frame(ffmpeg-&gt;formatCtx,&nbsp;-1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ffmpeg-&gt;formatCtx-&gt;start_time&nbsp;+&nbsp;time)&nbsp;*&nbsp;AV_TIME_BASE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVSEEK_FLAG_BACKWARD);</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #800000; ">time单位为秒<br /></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/216840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2019-09-19 09:51 <a href="http://www.cppblog.com/gaimor/archive/2019/09/19/216840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GAudio library 2.2.1.0发布啦</title><link>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 10 Dec 2015 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/212449.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/212449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/212449.html</trackback:ping><description><![CDATA[更新不多，主要是取消了插接结构，把所有的编解码和音效都合入了主库<br />dll合计不超过1M<br /><br />支持常见音频格式和音效，使用超级方便<br />下载在这里:<a href="/Files/gaimor/gaudio-sdk-2.2.1.0.zip">/Files/gaimor/gaudio-sdk-2.2.1.0.zip</a><img src ="http://www.cppblog.com/gaimor/aggbug/212449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2015-12-10 16:37 <a href="http://www.cppblog.com/gaimor/archive/2015/12/10/212449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GAudio介绍</title><link>http://www.cppblog.com/gaimor/archive/2013/11/26/204465.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 26 Nov 2013 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/11/26/204465.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/204465.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/11/26/204465.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/204465.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/204465.html</trackback:ping><description><![CDATA[gaudio是一个基于C/C++混合编程的跨平台音频库,当前支持windows32/64操作系统和linux32位操作系统<br /><br />当前性能:<br />1.最大支持音源同时播放的格式-8<br />2.单音源最大挂载的音效个数-8<br />3.全局最大可挂载的音效个数-8<br />4.当前支持语言C/C++/C#<br />5.当前支持的OS Win32/Win64/Linux32<br />6. 当前支持的音效-Fade in,Fade Out,Bassboost,Speed Changer,Echo,3D Effect,  Doppler, Phaser, Channel Merget, Channel Swap,&nbsp; Fft, Distortion,  Foldback Distortion, Modulator, AutoWah 等<br />7.当前支持的解码格式 - WAV, AU, AIFF, OGG, MOD,IT,XM,S3M,WV,MPC,WV,TTA,MP3,MIDI,FLAC<br />8.支持的编码格式 - WAV,AU,AIFF,OGG,MP2,MP3,FLAC,AAC,WV,VOC,CAF<br />9.支持的音频加载模式 - 文件加载，内存加载，虚拟文件加载<br />10.支持PAN,环绕音,全音量，音源音量设置<br /><br />下一步计划:<br />1.DEPHI绑定<br />2.MAC OS支持<br />3.Flanger,Chorus音效<br />4.TAK,AAC格式<br />5.故障处理 <br /><br />远景:<br />1.支持所有平台和手持设备<br />2.支持常见的所有音频格式<br />3.支持常见的所有音效<br />4.提高最易用最方便的API接口<br /><br />一个使用的小例子:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;GAudio&nbsp;2.1.0.1,&nbsp;(C)2013&nbsp;by&nbsp;Eric&nbsp;Du(E)<br />&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;program&nbsp;is&nbsp;a&nbsp;part&nbsp;of&nbsp;the&nbsp;GAudio&nbsp;SDK.<br />&nbsp;&nbsp;&nbsp;&nbsp;Use&nbsp;GAudio's&nbsp;echo&nbsp;effect<br /></span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">conio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">gaudio.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">echo&nbsp;created&nbsp;by&nbsp;D.Eric\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br /></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">(defined(WIN32)&nbsp;||&nbsp;defined(WIN64))</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_init(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">addons</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_init(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/usr/local/lib/gaudio/</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;filename&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">..\\media\\hurnscald.ogg</span><span style="color: #000000; ">"</span><span style="color: #000000;">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gsource</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;source&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;gaudio_source_create_from_file(filename,FALSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(source&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">load&nbsp;file:%s&nbsp;error!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bad&nbsp;source.\nerror&nbsp;code:%d.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,gaudio_error_get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gaudio_deinit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_source_set_int32(source,AUDIO_ENUM_LOOP,FALSE);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">play&nbsp;filename:%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,filename);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;geffect</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;effect&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;gaudio_effect_create(AUDIO_EFFECT_ECHO,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">effect)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">not&nbsp;support&nbsp;echo&nbsp;effect\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gaudio_source_destroy(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gaudio_deinit();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_effect_set_float(effect,AUDIO_EFFECT_ECHO_DELAY,</span><span style="color: #000000; ">1.0f</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_effect_set_float(effect,AUDIO_EFFECT_ECHO_DECAY,</span><span style="color: #000000; ">0.6f</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_effect_bind(effect,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_source_play(source,FALSE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\nplaying,&nbsp;press&nbsp;any&nbsp;key&nbsp;to&nbsp;quit.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;getch();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_effect_unbind(effect);<br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_effect_destroy(effect);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_source_stop(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_source_destroy(source);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;gaudio_deinit();<br />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">PAUSE</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;EXIT_SUCCESS;<br />}<br /></span></div><br />这个代表了我当前对音频这块的了解程度<br />下载在这里:<a href="www.geek-audio.org/download/zip/gaudio2.1.0.8.zip">download</a><br />欢迎提意见啊.<img src ="http://www.cppblog.com/gaimor/aggbug/204465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-11-26 19:53 <a href="http://www.cppblog.com/gaimor/archive/2013/11/26/204465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用libao+mpeg123播放mp3的例子</title><link>http://www.cppblog.com/gaimor/archive/2013/08/04/202333.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sun, 04 Aug 2013 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/08/04/202333.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/202333.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/08/04/202333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/202333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/202333.html</trackback:ping><description><![CDATA[直接上代码:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ao</span><span style="color: #000000; ">/</span><span style="color: #000000; ">ao.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">mpg123.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[])<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_initialize();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mpg123_handle&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">mpg123&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;iMpg123_error;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(MPG123_OK&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;(iMpg123_error&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mpg123_init()))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">failed&nbsp;to&nbsp;init&nbsp;mpg123\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mpg123&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mpg123_new(mpg123_decoders()[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">],&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">iMpg123_error);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(MPG123_OK&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;(iMpg123_error&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mpg123_open(mpg123,argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">])))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;in&nbsp;open&nbsp;mp3&nbsp;file\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;rate,channel,encoding;<br />&nbsp;&nbsp;&nbsp;&nbsp;mpg123_getformat(mpg123,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">rate,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">channel,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">encoding);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;default_driver&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_default_driver_id();<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_sample_format&nbsp;format;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(format));<br />&nbsp;&nbsp;&nbsp;&nbsp;format.bits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;channel;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;rate;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.byte_format&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AO_FMT_LITTLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_device&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">device;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_open_live(default_driver,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(device&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;opening&nbsp;device.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;buffer[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mpg123_read(mpg123,buffer,</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">read);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(read&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao_play(device,buffer,read);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mpg123_close(mpg123);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ao_close(device);<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/gaimor/aggbug/202333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-08-04 12:12 <a href="http://www.cppblog.com/gaimor/archive/2013/08/04/202333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下使用oss播放音乐</title><link>http://www.cppblog.com/gaimor/archive/2013/07/19/201978.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Fri, 19 Jul 2013 14:11:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/07/19/201978.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/201978.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/07/19/201978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/201978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/201978.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">errno.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">fcntl.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">math.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;defined(__OpenBSD__)&nbsp;||&nbsp;defined(__NetBSD__)</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">soundcard.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">soundcard.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">ioctl.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sndfile.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;BUFFER_LEN&nbsp;4096</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_open_default_oss_device(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">dev_path,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;id,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;blocking);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(argc</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SF_INFO&nbsp;info;<br />&nbsp;&nbsp;&nbsp;&nbsp;SNDFILE</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sf_open(argv[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">],SFM_READ,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">info);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">file)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">samplerate:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,info.samplerate);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">channel:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,info.channels);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;dsp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;dp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;_open_default_oss_device(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">dsp,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp; if(dp &lt; 0)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">dsp:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,dp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perror("oss bad:");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sf_close(file);<br />&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; return -1;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;info.channels;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ioctl(dp,SNDCTL_DSP_CHANNELS,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;info.samplerate;<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ioctl(dp,SNDCTL_DSP_SPEED,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AFMT_S16_LE;<br />&nbsp;&nbsp;&nbsp;&nbsp;ioctl(dp,SNDCTL_DSP_SAMPLESIZE,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">tmp);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;buffer[BUFFER_LEN];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">((len</span><span style="color: #000000; ">=</span><span style="color: #000000; ">sf_read_short(file,buffer,BUFFER_LEN))</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(dp,(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)buffer,len</span><span style="color: #000000; ">*</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;close(dp);<br />&nbsp;&nbsp;&nbsp;&nbsp;sf_close(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;free(dsp);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_open_default_oss_device(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">dev_path,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;id,</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;blocking)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fd;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buf[</span><span style="color: #000000; ">80</span><span style="color: #000000; ">];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(id</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/dev/sound/dsp%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strdup(buf)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strdup(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/dev/sound/dsp</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#ifdef&nbsp;BROKEN_OSS<br />&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path,&nbsp;O_WRONLY&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;O_NONBLOCK);<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path,&nbsp;O_WRONLY);<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fd&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(id</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(buf,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/dev/dsp%d</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strdup(buf)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;strdup(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/dev/dsp</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#ifdef&nbsp;BROKEN_OSS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path,&nbsp;O_WRONLY&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;O_NONBLOCK);<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path,&nbsp;O_WRONLY);<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#ifdef&nbsp;BROKEN_OSS<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fd&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;blocking)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fcntl(fd,&nbsp;F_SETFL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(fd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(fd&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">dev_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;fd;<br />}<br /><br />只是在的我的ubuntu13.0.4下执行执行 ./text music.wav 会提示错误 返回-1 提示 no such directory<br />在网上搜有人说需要加载snd_pcm_oss <div>modprobe snd_pcm_oss</div>可我加载的时候提示<br /><div>FATAL: Module snd_pcm_oss not found.<br />谁知道这个如何弄？<br /><br />另外查了下可以加载alsa-oss<br />之后调用aoss ./text music.wav来播放音乐<br />可以这个不是我要的，非命令行下不能加这个前缀</div></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/201978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-07-19 22:11 <a href="http://www.cppblog.com/gaimor/archive/2013/07/19/201978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gaudio是一个基于C/C++混合编程的音频库~</title><link>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 11 Jul 2013 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/201711.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/201711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/201711.html</trackback:ping><description><![CDATA[<div>gaudio是一个基于C/C++混合编程的跨平台音频库,当前支持windows32操作系统和linux32位操作系统<br /><br />修改记录<br />1.2013.04.01<br />&nbsp;&nbsp;&nbsp; 初次发布<br />2.2013.04.10<br />&nbsp;&nbsp;&nbsp; 完成对wav格式采样频率8000-48000,采样格式4,8,16,24,32的支持 &nbsp;&nbsp; &nbsp;<br />3.2013.05.01<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.4.0.8<br />&nbsp;&nbsp;&nbsp; b.修改一个退出异常<br />&nbsp;&nbsp;&nbsp; c.支持二源混音<br />&nbsp;&nbsp;&nbsp; d.使用载入插件的方式提供对wav播放的支持<br />&nbsp;&nbsp;&nbsp; e.增加对au格式的支持<br />&nbsp;&nbsp;&nbsp; f.增加echo音效<br />&nbsp;&nbsp;&nbsp; g.增加bassboost音效<br />&nbsp;&nbsp;&nbsp; h.增加函数gaudio_address_get<br />&nbsp;&nbsp;&nbsp; i.增加使用例子:echo/mixer/stream/boost<br />&nbsp;&nbsp;&nbsp; j.把设置,获取音源三维空间信息的函数调整为: gaudio_source_set_float3,gaudio_source_get_float3<br />&nbsp;&nbsp;&nbsp; k.修改解码器结构为回调模式<br />4.2013.05.10<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.6.8.0<br />&nbsp;&nbsp;&nbsp; b.优化部分代码<br />&nbsp;&nbsp;&nbsp; c.增加speedchanger音效<br />&nbsp;&nbsp;&nbsp; d.增加音频翻转(g168)<br />&nbsp;&nbsp;&nbsp; e.增加音频声道交换(g168)<br />&nbsp;&nbsp;&nbsp; f.增加声道合并(g168)<br />&nbsp;&nbsp;&nbsp; g.增加speedchanger/invert测试用例<br />&nbsp;&nbsp;&nbsp; h.增加vc调用静态链接库libgaudio.lib<br />&nbsp;&nbsp;&nbsp; i.增加调制音效和测试例子<br />&nbsp;&nbsp;&nbsp; j.修改解码器框架<br />&nbsp;&nbsp;&nbsp; k.修改获取音频采样编码格式不正确的问题<br />&nbsp;&nbsp;&nbsp; l.解决seek定位不准的问题<br />&nbsp;&nbsp;&nbsp; m.增加音效链测试例子<br />&nbsp;&nbsp;&nbsp; n.增加函数gaudio_set_long,gaudio_get_long<br />&nbsp;&nbsp;&nbsp; o.修改stream例子<br />&nbsp;&nbsp;&nbsp; p.支持压缩mpc音频格式<br />&nbsp;&nbsp;&nbsp; q.支持ogg/vorbis格式<br />&nbsp;&nbsp;&nbsp; r.修改获取采样格式错误的bug<br />&nbsp;&nbsp;&nbsp; t.增加接口说明文档&nbsp;&nbsp; &nbsp;<br />5.2013.06.10<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.7.2.0<br />&nbsp;&nbsp;&nbsp; b.gaudio_source_set_error_callback回调函数增加音源参数<br />&nbsp;&nbsp;&nbsp; c.gaudio_source_set_finish_callback回调函数增加音源参数<br />&nbsp;&nbsp;&nbsp; d.移除gaudio_get_version函数<br />&nbsp;&nbsp;&nbsp; e.gaudio_effect_setcallback函数调整为gaudio_effect_set_callback<br />&nbsp;&nbsp;&nbsp; f.使用插件式的音频驱动模式 - gwinmm<br />&nbsp;&nbsp;&nbsp; g.gaudio代码优化<br />&nbsp;&nbsp;&nbsp; h.增加音频源码率的获取<br />&nbsp;&nbsp;&nbsp; i.增加feature范例<br />&nbsp;&nbsp;&nbsp; j.完善文档<br />&nbsp;&nbsp;&nbsp; k.增加对mp3的支持<br />&nbsp;&nbsp;&nbsp; l.移除invert/modulator/bassboost例子<br />&nbsp;&nbsp;&nbsp; m.增加balance<br />6.2013.07.07<br />&nbsp;&nbsp;&nbsp; a.版本提升到1.8.0.2<br />&nbsp;&nbsp;&nbsp; b.增加对交换文件aiff的支持<br />&nbsp;&nbsp;&nbsp; c.修改音频驱动插件实现<br />&nbsp;&nbsp;&nbsp; d.增加移相器音效<br />&nbsp;&nbsp;&nbsp; e.修改部分API接口使用的long为int32_t以方便移植<br />&nbsp;&nbsp;&nbsp; f.增加code::blocks测试工程<br />&nbsp;&nbsp;&nbsp; g.增加msvc2008测试工程<br />&nbsp;&nbsp;&nbsp; h.增加函数接口gaudio_source_create_from_buffer2以播放raw音频数据<br />&nbsp;&nbsp;&nbsp; i.把各个音效参数提到单独文件<br />&nbsp;&nbsp;&nbsp; j.简化wav解码<br />&nbsp;&nbsp;&nbsp; k.修改几处内存泄漏<br />&nbsp;&nbsp;&nbsp; l.增加音频回录功能,输出格式MP2,MP3,APE,WV,AAC,WAV,AU,AIFF,VOC,CAF,OGG<br />&nbsp;&nbsp; &nbsp;当前录制信息:16位音频,双声道,采样频率44100<br />&nbsp;&nbsp;&nbsp; m.增加音频回录的例子recorder<br />&nbsp;&nbsp;&nbsp; n.测试例子使用getopt和usage提示<br />&nbsp;&nbsp;&nbsp; o.增加对tta格式的支持&nbsp;&nbsp; &nbsp;<br />7.2013.07.28<br />&nbsp;&nbsp;&nbsp; a.版本提升到1.9.8.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; b.解决了wav,au,aiff播放进度不准的故障 <br />&nbsp;&nbsp;&nbsp; c.优化wav/au/aiff解码性能&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; d.增加distortion音效&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; e.增加foldback distortion音效&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; f.增加distortion音效使用例子&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; g.增加声音穿透力&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; h.修改结构最大支持八声道&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; i.增加portaudio插件驱动(win32&amp;linux)&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; j.完成g168,bassbost的liux版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; k.完成wav,au音频格式的linux版本&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; l.代码增加部分注释(未完成)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; m.尝试性支持linux操作系统&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; n.支持midi/mid音乐格式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; o.解决了mixer混音退出报错的问题<br />&nbsp; &nbsp; p.skip id3v2 &nbsp;&nbsp;&nbsp; <br /><div>8.2013.08.16<br />&nbsp;&nbsp;&nbsp; a.版本提升到2.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; b.变量宏增加AUDIO_ENUM前缀 <br />&nbsp;&nbsp;&nbsp; c.增加非标准插件gsndfile支持flac/ogg/au/wav/aiff/voc/caf/..基于(sndfile)<br />&nbsp;&nbsp;&nbsp; d.改用mpg123解码mp3<br />&nbsp;&nbsp; &nbsp;e.支持FFT频谱<br /><div>9.2013.09.08<br />&nbsp;&nbsp;&nbsp; a.版本提升到2.0.6.0<br />&nbsp;&nbsp;&nbsp; b.修改CROSSFEED宏和相关&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;c.引入200号插件支持s3m/mod/it/xm音频格式<br />&nbsp;&nbsp; &nbsp;d.整理测试用例<br />&nbsp;&nbsp; &nbsp;e.增加autowah音效<br />&nbsp;&nbsp; &nbsp;f.增加驱动检测<br />10.2015.12.10 版本2.2.1.0</div><div>支持常见音频格式和音效，使用超级方便<br />下载在这里:<a href="http://www.cppblog.com/Files/gaimor/gaudio-sdk-2.2.1.0.zip">/Files/gaimor/gaudio-sdk-2.2.1.0.zip</a></div><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;<a href="/Files/gaimor/gaudio-sdk-2101.zip"></a></div></div><img src ="http://www.cppblog.com/gaimor/aggbug/201711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-07-11 22:49 <a href="http://www.cppblog.com/gaimor/archive/2013/07/11/201711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用LIBMAD播放MP3的例子</title><link>http://www.cppblog.com/gaimor/archive/2013/06/09/200905.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sun, 09 Jun 2013 13:14:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/06/09/200905.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/200905.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/06/09/200905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/200905.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/200905.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ao</span><span style="color: #000000; ">/</span><span style="color: #000000; ">ao.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">libmad</span><span style="color: #000000; ">/</span><span style="color: #000000; ">mad.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">math.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">limits.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br />signed&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;to_short(mad_fixed_t&nbsp;</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">MAD_F_ONE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">(SHRT_MAX);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">&lt;=-</span><span style="color: #000000; ">MAD_F_ONE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">(</span><span style="color: #000000; ">-</span><span style="color: #000000; ">SHRT_MAX);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">(MAD_F_FRACBITS</span><span style="color: #000000; ">-</span><span style="color: #000000; ">15</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">((signed&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">)</span><span style="color: #0000FF; ">fixed</span><span style="color: #000000; ">);<br />}<br /><br />unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;inputBuffer[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;MAD_BUFFER_GUARD];<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;libMP3<br />{<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;libMP3(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;filename)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fopen(filename,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">rb</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_stream_init(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">stream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_frame_init(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">frame);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_synth_init(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">synth);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_timer_reset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">timer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">libMP3()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_synth_finish(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">synth);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_frame_finish(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">frame);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_stream_finish(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">stream);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(file);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;setup()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;&nbsp;&nbsp;&nbsp;remaining;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;read;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(stream.next_frame</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remaining</span><span style="color: #000000; ">=</span><span style="color: #000000; ">stream.bufend</span><span style="color: #000000; ">-</span><span style="color: #000000; ">stream.next_frame;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memmove(inputBuffer,stream.next_frame,remaining);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;inputBuffer</span><span style="color: #000000; ">+</span><span style="color: #000000; ">remaining;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readsize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">-</span><span style="color: #000000; ">remaining;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readsize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;inputBuffer,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remaining</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readsize&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;fread(read,</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,readsize,file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(readsize</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #008000;"><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_stream_buffer(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">stream,inputBuffer,readsize</span><span style="color: #000000; ">+</span><span style="color: #000000; ">remaining);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;dest[</span><span style="color: #000000; ">100</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mad_timer_string(timer,&nbsp;dest,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%02lu:%02u:%02u</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MAD_UNITS_HOURS,&nbsp;MAD_UNITS_MILLISECONDS,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.error</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(mad_error)</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;readFrame(unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pcm)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(stream.buffer&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(setup()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(mad_frame_decode(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">frame,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">stream)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(MAD_RECOVERABLE(stream.error))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(stream.error</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">MAD_ERROR_LOSTSYNC)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(stream.error</span><span style="color: #000000; ">==</span><span style="color: #000000; ">MAD_ERROR_BUFLEN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(setup()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;mad_synth_frame(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">synth,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">frame);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!&nbsp;获取频率<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">freq&nbsp;=&nbsp;synth.pcm.samplerate;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">bitrate&nbsp;=&nbsp;frame.header.bitrate;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">channels&nbsp;=&nbsp;(frame.header.mode&nbsp;==&nbsp;MAD_MODE_SINGLE_CHANNEL)&nbsp;?&nbsp;1&nbsp;:&nbsp;2;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mad_timer_add(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">timer,frame.header.duration);</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">synth.pcm.length;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signed&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sample;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sample</span><span style="color: #000000; ">=</span><span style="color: #000000; ">to_short(synth.pcm.samples[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">][i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcm[j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sample</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">0xff</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcm[j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sample</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(MAD_NCHANNELS(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">frame.header)</span><span style="color: #000000; ">==</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sample</span><span style="color: #000000; ">=</span><span style="color: #000000; ">to_short(synth.pcm.samples[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">][i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcm[j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sample</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">0xff</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pcm[j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sample</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;dest[</span><span style="color: #000000; ">120</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;mad_timer_string(timer,dest,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%lu:%02lu.%03u</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;MAD_UNITS_MINUTES,&nbsp;MAD_UNITS_MILLISECONDS,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;j;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;mad_stream&nbsp;&nbsp;&nbsp;&nbsp;stream;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;mad_frame&nbsp;&nbsp;&nbsp;&nbsp;frame;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;mad_synth&nbsp;&nbsp;&nbsp;&nbsp;synth;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;mad_header&nbsp;&nbsp;&nbsp;header;<br />&nbsp;&nbsp;&nbsp;&nbsp;mad_timer_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;file;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;readsize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />};<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">44100</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;data[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_device&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">device;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_sample_format&nbsp;format;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;default_driver;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;default_driver&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_default_driver_id();<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(format));<br />&nbsp;&nbsp;&nbsp;&nbsp;format.bits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;channels;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;rate;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.byte_format&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AO_FMT_LITTLE;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;libMP3&nbsp;mp3(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">我只在乎你.mp3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_open_live(default_driver,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(device&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;opening&nbsp;device.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buffer[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">*</span><span style="color: #000000; ">2</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;mp3.readFrame(buffer))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao_play(device,(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)buffer,len);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;ao_close(device);<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />}</span></div><img src ="http://www.cppblog.com/gaimor/aggbug/200905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-06-09 21:14 <a href="http://www.cppblog.com/gaimor/archive/2013/06/09/200905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发一个我写的音频库</title><link>http://www.cppblog.com/gaimor/archive/2013/06/02/200755.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sun, 02 Jun 2013 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/06/02/200755.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/200755.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/06/02/200755.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/200755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/200755.html</trackback:ping><description><![CDATA[<div>gaudio是一个使用最方便的音频播放库</div>修改记录<br />1.2013.04.01<br />&nbsp;&nbsp;&nbsp; 初次发布<br />2.2013.04.10<br />&nbsp;&nbsp;&nbsp; 完成对wav格式采样频率8000-48000,采样格式4,8,16,24,32的支持 &nbsp;&nbsp; &nbsp;<br />3.2013.05.01<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.4.0.8<br />&nbsp;&nbsp;&nbsp; b.修改一个退出异常<br />&nbsp;&nbsp;&nbsp; c.支持二源混音<br />&nbsp;&nbsp;&nbsp; d.使用载入插件的方式提供对wav播放的支持<br />&nbsp;&nbsp;&nbsp; e.增加对au格式的支持<br />&nbsp;&nbsp;&nbsp; f.增加echo音效<br />&nbsp;&nbsp;&nbsp; g.增加bassboost音效<br />&nbsp;&nbsp;&nbsp; h.增加函数gaudio_address_get<br />&nbsp;&nbsp;&nbsp; i.增加使用例子:echo/mixer/stream/boost<br />&nbsp;&nbsp; &nbsp;j.把设置,获取音源三维空间信息的函数调整为: gaudio_source_set_float3,gaudio_source_get_float3<br />&nbsp;&nbsp; &nbsp;k.修改解码器结构为回调模式<br />4.2013.05.10<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.6.8.0<br />&nbsp;&nbsp;&nbsp; b.优化部分代码<br />&nbsp;&nbsp;&nbsp; c.增加speedchanger音效<br />&nbsp;&nbsp; &nbsp;d.增加音频翻转(g168)<br />&nbsp;&nbsp; &nbsp;e.增加音频声道交换(g168)<br />&nbsp;&nbsp; &nbsp;f.增加声道合并(g168)<br />&nbsp;&nbsp; &nbsp;g.增加speedchanger/invert测试用例<br />&nbsp;&nbsp; &nbsp;h.增加vc调用静态链接库libgaudio.lib<br />&nbsp;&nbsp; &nbsp;i.增加调制音效和测试例子<br />&nbsp;&nbsp; &nbsp;j.修改解码器框架<br />&nbsp;&nbsp; &nbsp;k.修改获取音频采样编码格式不正确的问题<br />&nbsp;&nbsp; &nbsp;l.解决seek定位不准的问题<br />&nbsp;&nbsp; &nbsp;m.增加音效链测试例子<br />&nbsp;&nbsp; &nbsp;n.增加函数gaudio_set_long,gaudio_get_long<br />&nbsp;&nbsp; &nbsp;o.修改stream例子<br />&nbsp;&nbsp; &nbsp;p.支持压缩mpc音频格式<br />&nbsp;&nbsp; &nbsp;q.支持ogg/vorbis格式<br />&nbsp;&nbsp;&nbsp; r.修改获取采样格式错误的bug<br />&nbsp;&nbsp;&nbsp; t.增加接口说明文档&nbsp;&nbsp; &nbsp;<br />5.2013.06.01<br />&nbsp;&nbsp;&nbsp; a.版本提升为1.7.2.0<br />&nbsp;&nbsp;&nbsp; b.gaudio_source_set_error_callback回调函数增加音源参数<br />&nbsp;&nbsp; &nbsp;c.gaudio_source_set_finish_callback回调函数增加音源参数<br />&nbsp;&nbsp; &nbsp;d.移除gaudio_get_version函数<br />&nbsp;&nbsp; &nbsp;e.gaudio_effect_setcallback函数调整为gaudio_effect_set_callback<br />&nbsp;&nbsp; &nbsp;f.使用插件式的音频驱动模式(gwinmm)以方便支持linux和mac<br />&nbsp;&nbsp; &nbsp;g.gaudio代码优化<br />&nbsp;&nbsp; &nbsp;h.增加音频源码率的获取<br />&nbsp;&nbsp; &nbsp;i.修改gfeature范例<br />&nbsp;&nbsp; &nbsp;j.完善文档<br /><br />readmap<br />1.格式:对mp3的支持<br />2.音效:立体声增强<br />3.处理故障/优化代码&nbsp;&nbsp; &nbsp;<br /><br />target<br />1.支持常见音频格式<br />2.支持常见音效<br />3.支持3D播放模式<br />4.最大支持3-8个音源同时播放<br />5.支持音频转换<br />6.支持录音<br />7.支持音频美化<br />8.跨平台&nbsp;&nbsp;&nbsp; <img src ="http://www.cppblog.com/gaimor/aggbug/200755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-06-02 12:41 <a href="http://www.cppblog.com/gaimor/archive/2013/06/02/200755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WAVPACK音频编码</title><link>http://www.cppblog.com/gaimor/archive/2013/02/09/197786.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sat, 09 Feb 2013 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2013/02/09/197786.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/197786.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2013/02/09/197786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/197786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/197786.html</trackback:ping><description><![CDATA[To use the library to create WavPack files from raw PCM audio, the user must provide a WavpackBlockOutput function that is used by the library to write finished WavPack blocks to the output. Unlike the read case, there is no facility to write directly to named files. Here is the function required:<br /><br />&nbsp; typedef int (*WavpackBlockOutput)(void *id, void *data, int32_t bcount);<br /><br />where the "id" is used to differentiate the regular WavPack data "wv" from the correction data "wvc" (or for the case of multiple streams running at the same time). The return value is simply TRUE for success and FALSE for error. An example of this function can be found in wavpack.c called write_block().<br /><br />The basic procedure for creating WavPack files is this:<br /><br />&nbsp; 1. get a context and set block output function with WavpackOpenFileOutput()<br />&nbsp; 2. set the data format and specify modes with WavpackSetConfiguration()<br />&nbsp; 3. optionally write a RIFF header with WavpackAddWrapper()<br />&nbsp; 4. allocate buffers and prepare for packing with WavpackPackInit()<br />&nbsp; 5. actually compress audio and write blocks with WavpackPackSamples()<br />&nbsp; 6. flush final samples into blocks with WavpackFlushSamples()<br />&nbsp; 7. optionally write MD5 sum with WavpackStoreMD5Sum()<br />&nbsp; 8. optionally write RIFF trailer with WavpackAddWrapper()<br />&nbsp; 9. if MD5 sum or RIFF trailer written, call WavpackFlushSamples() again<br />&nbsp; 10. optionally append metadata tag with functions in next section<br />&nbsp; 11. optionally update number of samples with WavpackUpdateNumSamples()<br />&nbsp; 12. close the context with WavpackCloseFile()<br /><br />Note that this does not show opening and closing the output files which is done by the application itself.<br /><br />&nbsp; WavpackContext *WavpackOpenFileOutput (WavpackBlockOutput blockout,void *wv_id, void *wvc_id);<br />&nbsp; -----------------------------------------------------------------<br /><br />Open context for writing WavPack files. The returned context pointer is used in all following calls to the library. The "blockout" function will be used to store the actual completed WavPack blocks and will be called with the id pointers containing user defined data (one for the wv file and one for the wvc file). A return value of NULL indicates that memory could not be allocated for the context.<br /><br />&nbsp; int WavpackSetConfiguration (WavpackContext *wpc,WavpackConfig *config,uint32_t total_samples);<br />&nbsp; ----------------------------------------------------<br /><br />Set configuration for writing WavPack files. This must be done before sending any actual samples, however it is okay to send wrapper or other metadata before calling this. The "config" structure contains the following *required* information:<br /><br />&nbsp;config-&gt;bytes_per_sample&nbsp;&nbsp;&nbsp;&nbsp; see WavpackGetBytesPerSample() for info<br />&nbsp;config-&gt;bits_per_sample&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; see WavpackGetBitsPerSample() for info<br />&nbsp;config-&gt;channel_mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft standard (mono = 4, stereo = 3)<br />&nbsp;config-&gt;num_channels&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self evident<br />&nbsp;config-&gt;sample_rate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self evident<br /><br />Be particularly careful with the "channel_mask" field. If this is not set to the correct value (3 or 4) then everything will still appear to work<br />correctly, but the resulting WavPack file will have undefined channel assignments. When this file is unpacked back to WAV it will then get a<br />WAVEFORMATEXTENSIBLE header which some programs refuse to recognize.<br /><br />Specifying these 5 parameters alone would create a default lossless WavPack file, identical to the one produced by using the command-line program without options. For optional configuration, the following fields and flags may be set:<br /><br />&nbsp;config-&gt;flags:<br />&nbsp;--------------<br />&nbsp;o CONFIG_HYBRID_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select hybrid mode (must set bitrate)<br />&nbsp;o CONFIG_JOINT_STEREO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select joint stereo (must set override also)<br />&nbsp;o CONFIG_JOINT_OVERRIDE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; override default joint stereo selection<br />&nbsp;o CONFIG_HYBRID_SHAPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select hybrid noise shaping (set override &amp; shaping_weight != 0.0)<br />&nbsp;o CONFIG_SHAPE_OVERRIDE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; override default hybrid noise shaping (set CONFIG_HYBRID_SHAPE and shaping_weight)<br />&nbsp;o CONFIG_DYNAMIC_SHAPING&nbsp;&nbsp;&nbsp;&nbsp; force dynamic noise shaping even when WavPack<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; would not use it (no need to set any of the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other shaping flags when using this one)<br />&nbsp;o CONFIG_FAST_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "fast" compression mode (same as -f)<br />&nbsp;o CONFIG_HIGH_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "high" compression mode (same as -h)<br />&nbsp;o CONFIG_VERY_HIGH_FLAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "very high" compression mode (same as -hh)<br />&nbsp;o CONFIG_BITRATE_KBPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hybrid bitrate is kbps, not bits / sample<br />&nbsp;o CONFIG_CREATE_WVC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create correction file<br />&nbsp;o CONFIG_OPTIMIZE_WVC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maximize bybrid compression (same as -cc)<br />&nbsp;o CONFIG_CALC_NOISE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calc noise in hybrid mode<br />&nbsp;o CONFIG_EXTRA_MODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extra processing mode (same as -x)<br />&nbsp;o CONFIG_SKIP_WVX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; no wvx stream for floats &amp; large ints (same as -p)<br />&nbsp;o CONFIG_MD5_CHECKSUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specify if you plan to store MD5 signature (the sum is calculated by the application, NOT by the library)<br />&nbsp;o CONFIG_CREATE_EXE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specify if you plan to prepend sfx module<br />&nbsp;o CONFIG_OPTIMIZE_MONO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; detect and optimize for mono files posing as<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stereo (uses a more recent stream format that<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is not compatible with decoders &lt; 4.3)<br /><br />&nbsp;config-&gt;bitrate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hybrid bitrate in either bits/sample or kbps<br />&nbsp;config-&gt;shaping_weight&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hybrid noise shaping coefficient override<br />&nbsp;config-&gt;block_samples&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; force samples per WavPack block (0 = use default, else 1-131072)<br />&nbsp;config-&gt;float_norm_exp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select floating-point data (127 for +/-1.0)<br />&nbsp;config-&gt;xmode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extra mode processing value override (1-6)<br /><br />If the number of samples to be written is known then it should be passed here.<br />If the duration is not known then pass -1. In the case that the size is not<br />known (or the writing is terminated early) then it is suggested that the<br />application retrieve the first block written and let the library update the<br />total samples indication. A function is provided to do this update and it<br />should be done to the "correction" file also. If this cannot be done (because<br />a pipe is being used, for instance) then a valid WavPack will still be created<br />(assuming the initial duration was set to -1), but when applications want to<br />access that file they will have to seek all the way to the end to determine the<br />actual duration (the library takes care of this). Also, if a RIFF header has<br />been included then it should be updated as well or the WavPack file will not be<br />directly unpackable to a valid wav file (although it will still be usable by<br />itself). A return of FALSE indicates an error (use WavpackGetErrorMessage() to<br />find out what happened).<br /><br />&nbsp; int WavpackPackInit (WavpackContext *wpc);<br />&nbsp; -----------------------------------------<br /><br />Prepare to actually pack samples by determining the size of the WavPack blocks<br />and allocating sample buffers and initializing each stream. Call after<br />WavpackSetConfiguration() and before WavpackPackSamples(). A return of FALSE<br />indicates an error.<br /><br />&nbsp; int WavpackPackSamples (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int32_t *sample_buffer,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t sample_count);<br />&nbsp; ----------------------------------------------<br /><br />Pack the specified samples. Samples must be stored in 32-bit longs in the<br />native endian format of the executing processor. The number of samples specified<br />indicates composite samples (sometimes called "frames"). So, the actual number<br />of data points would be this "sample_count" times the number of channels. Note<br />that samples are accumulated here until enough exist to create a complete<br />WavPack block (or several blocks for multichannel audio). If an application<br />wants to break a block at a specific sample, then it just calls<br />WavpackFlushSamples() to force an early termination. Completed WavPack blocks<br />are sent to the function provided in the initial call to<br />WavpackOpenFileOutput(). A return of FALSE indicates an error (which most likely<br />indicates the that user-supplied blockout function returned an error).<br /><br />&nbsp; int WavpackFlushSamples (WavpackContext *wpc);<br />&nbsp; ---------------------------------------------<br /><br />Flush all accumulated samples into WavPack blocks. This is normally called after<br />all samples have been sent to WavpackPackSamples(), but can also be called to<br />terminate a WavPack block at a specific sample (in other words it is possible<br />to continue after this operation). This also must be called to dump non-audio<br />blocks like those holding metadata for MD5 sums or RIFF trailers. A return of<br />FALSE indicates an error.<br /><br />&nbsp; void WavpackUpdateNumSamples (WavpackContext *wpc, void *first_block);<br />&nbsp; ---------------------------------------------------------------------<br /><br />Given the pointer to the first block written (to either a .wv or .wvc file),<br />update the block with the actual number of samples written. If the wav header<br />was generated by the library, then it is updated also. This should be done if<br />WavpackSetConfiguration() was called with an incorrect number of samples (or<br />-1). This should also be done in the case where the application did not provide<br />the RIFF header but did add some chunks for a RIFF trailer (see the section<br />on adding RIFF metadata). It is the responsibility of the application to read<br />and rewrite the block. An example of this can be found in the Audition filter<br />or in the command-line packer when the -i option is used. ON MACHINES WITH<br />ALIGNMENT REQUIREMENTS, BE SURE THAT THE PASSED POINTER IS PROPERLY ALIGNED!<br /><br />&nbsp; int WavpackStoreMD5Sum (WavpackContext *wpc, uchar data [16]);<br />&nbsp; -------------------------------------------------------------<br /><br />Store computed MD5 sum in WavPack metadata. Note that the user must compute the<br />16 byte sum; it is not done here. It is also required that WavpackFlushSamples()<br />be called after this to make sure the block containing the MD5 sum is actually<br />written. A return of FALSE indicates an error.<br /><br />&nbsp; WavpackContext *WavpackCloseFile (WavpackContext *wpc);<br />&nbsp; ------------------------------------------------------<br /><br />Close the specified WavPack file and release all resources used by it.<br />Returns NULL.<br /><br /><br />With respect to the RIFF WAV wrapper that is inormally appended to the WavPack<br />file, there are three options available for the application to handle this.<br /><br />The first is the simplest, and that is for the application to simply do<br />nothing. The library will automatically create a RIFF header appropriate for<br />the audio data (including WAVEFORMATEXTENSIBLE if needed) and store this<br />in the WavPack file. If the application does not know the actual number of<br />samples beforehand and needs to reread the first block and have the library<br />update it, then the library will handle updating its own RIFF header also.<br />In this scenario, there will be no trailing RIFF data. For the vast majority<br />of applications, this will be all that is required.<br /><br />However, some applications may want to store a custom RIFF header (and trailer)<br />so that they can store extra RIFF chunks in there or perhaps they want to<br />create an exact copy of a .wav file (like the WavPack command-line program<br />does). To accomplish this, functions are provided (see below) to add RIFF<br />metadata to a WavPack file being written. In this case, the application must<br />provide a verbatim copy of all the RIFF data from the initial "RIFF" at the<br />beginning of the file up to (and including) the size field of the "data"<br />chunk. If any trailing RIFF data is desired, then this is appended after all<br />samples have been packed and flushed. This wrapper data will be *exactly*<br />what wvunpack will use to restore an original WAV file. In no circumstances<br />does the WavPack library parse, verify, or otherwise use this data.<br /><br />If the RIFF header information needs to be updated after packing (because the<br />total file size or the data chunk size need to be update) then the first<br />block must be reread and the function WavpackGetWrapperLocation() must be<br />called to find the wrapper in the block (it would be possible to find it by<br />searching for the "RIFF", but using this function is significantly less ugly).<br />The WavPack library will not touch a wrapper that it did not create when<br />calling WavpackUpdateNumSamples().<br /><br />The third option for including RIFF data chunks is a hybrid between these<br />two methods and is useful if an application wants to add a few specific RIFF<br />chunks and does not mind if the chunks appear at the end of the WAV file. In<br />this method, the application does not send any RIFF header before packing the<br />audio data which forces the library to create and store a standard RIFF header.<br />However, when all samples have been packed, the application sends the RIFF<br />chunks that it wants to add at the end of the file (RIFF trailer). Then, after<br />flushing, it must reread the first block and call WavpackUpdateNumSamples() so<br />that the library can update the RIFF header to reflect the added chunks (even<br />if the number of samples was correct). Because the library created the header,<br />it will update it, and will take into account the RIFF chunks added to the end.<br /><br />All of this wrapper stuff can be a little confusing. It is a good idea to<br />test that the final application is working correctly and creating WavPack<br />files that will unpack to valid WAV files (even if the RIFF info is totally<br />wrong, the files will still work perfectly well as WavPack files because,<br />again, the RIFF wrapper is just informational). The first test is to use the<br />-ss option on WvUnpack to make sure the RIFF wrapper is reported correctly.<br />Then, unpack the WavPack file into a WAV using WvUnpack and repack it again<br />with the standard WavPack command-line program (without options). If it<br />doesn't complain about anything then there is a good chance that all the<br />wrapper information is valid.<br /><br />Here are the appropriate functions:<br /><br />&nbsp; int WavpackAddWrapper (WavpackContext *wpc, void *data, uint32_t bcount);<br />&nbsp; ------------------------------------------------------------------------<br /><br />Add wrapper (currently RIFF only) to WavPack blocks. This should be called<br />before sending any audio samples in the case of the RIFF header or after all<br />samples have been sent (and flushed) for any RIFF trailer. It is also<br />required that WavpackFlushSamples() be called again after specifying a RIFF<br />trailer to make sure it is actually written to the file.<br /><br />If the exact contents of the RIFF header are not known because, for example,<br />the file duration is uncertain or trailing chunks are possible, simply write<br />a "dummy" header of the correct length. When all data has been written it<br />will be possible to read the first block written and update the header<br />directly. An example of this can be found in the Audition filter. A return of<br />FALSE indicates an error.<br /><br />&nbsp; void *WavpackGetWrapperLocation (void *first_block, uint32_t *size);<br />&nbsp; -------------------------------------------------------------------<br /><br />Given the pointer to the first block written to a WavPack file, this function<br />returns the location of the stored RIFF header that was originally written with<br />WavpackAddWrapper(). This would normally be used to update the wav header to<br />indicate that a different number of samples was actually written or if<br />additional RIFF chunks are written at the end of the file. The "size" parameter<br />can be set to non-NULL to obtain the exact size of the RIFF header, and the<br />function will return FALSE if the header is not found in the block's metadata<br />(or it is not a valid WavPack block). Note that the size of the RIFF header<br />cannot be changed and it is the responsibility of the application to read and<br />rewrite the block. An example of this can be found in the Audition filter.<br /><br /><br />******************************************************************************<br />*************************&nbsp;&nbsp; 5.0 TAGGING FUNCTIONS&nbsp;&nbsp; **************************<br />******************************************************************************<br /><br />The WavPack library contains rudimentary support to read and write metadata tags<br />on WavPack files. This includes creating new APEv2 tags during WavPack file<br />creation, reading text fields from both ID3v1 and APEv2 tags on existing<br />WavPack files, and editing data in APEv2 tags.<br /><br />Users should be aware of the following limitations of this functionality:<br /><br />1. ID3v1 tags are read-only, and cannot be accessed if there is an APEv2 tag<br />&nbsp;&nbsp; prior to them in the file. ID3v1 tags are lost if the prior APEv2 tag is<br />&nbsp;&nbsp; edited.<br /><br />2. The text items in APEv2 tags are UTF-8 encoded. The functionality of<br />&nbsp;&nbsp; converting to/from any local or multi-byte encoding must be handled by the<br />&nbsp;&nbsp; calling application.<br /><br />3. The binary items of APEv2 tags can now (version 4.60+) be read and written.<br />&nbsp;&nbsp; To implement this in a backward-compatible way, the existing functions for<br />&nbsp;&nbsp; accessing text tag items were simply duplicated as versions handling only<br />&nbsp;&nbsp; binary tags items. The versions for text tag items work exactly as before<br />&nbsp;&nbsp; (ignoring binary items) and the binary versions ignore text items.<br /><br />&nbsp;&nbsp; The convention for binary tag items in APEv2 tags is that the data starts<br />&nbsp;&nbsp; with a NULL-terminated string representing a filename. After the terminating<br />&nbsp;&nbsp; NULL, the actual binary data starts. In the WavPack code this filename has<br />&nbsp;&nbsp; only the extension of the actual file; the name portion is made up of the<br />&nbsp;&nbsp; tag item name. NOTE THAT THIS FUNCTIONALITY IS NOT HANDLED IN THE LIBRARY.<br />&nbsp;&nbsp; THE LIBRARY ONLY STORES AND RETRIEVES A BINARY IMAGE AND IT IS UP TO THE<br />&nbsp;&nbsp; CALLING APPLICATION TO APPEND AND HANDLE THIS FILENAME.<br /><br />4. When APEv2 tags are edited and the resulting tags are shorter than the<br />&nbsp;&nbsp; original tags, the tag is padded with zeros at the front rather than having<br />&nbsp;&nbsp; the file shortened, and this padding cannot be reclaimed by future editing.<br />&nbsp;&nbsp; The net result of this is that repeated editing of tags will cause the file<br />&nbsp;&nbsp; to grow indefinitely (although this will only happen when the tag is<br />&nbsp;&nbsp; actually made smaller).<br /><br />In these descriptions the meaning of the word "tag" refers to the whole bundle<br />that is appended to the end of the WavPack file. This bundle may contain many<br />individual items, each consisting of a key/value pair. The key is referred to<br />here as the "item", meaning the item's name (like "artist"). Some people refer<br />to the individual items as "tags", but that usage is not used here. Also note<br />that APEv2 tags store the case of tag item names and values, but are not case<br />sensitive when locating tag item names (and this is carried here into the<br />lookup of ID3v1 tag item names).<br /><br /><br />&nbsp; int WavpackGetNumTagItems (WavpackContext *wpc);<br />&nbsp; int WavpackGetNumBinaryTagItems (WavpackContext *wpc);<br />&nbsp; ------------------------------------------------------<br /><br />Count and return the total number of tag items (either text or binary) in the<br />specified file. This works with either ID3v1 tags or APEv2 tags (although ID3V1<br />tags do not have binary items).<br /><br />&nbsp; int WavpackGetTagItem (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size);<br /><br />&nbsp; int WavpackGetBinaryTagItem (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size)<br />&nbsp; ------------------------------------------------------------<br /><br />Attempt to get the specified item from the specified file's ID3v1 or APEv2 tag.<br />The "size" parameter specifies the amount of space available at "value", if the<br />desired text item will not fit in this space then ellipses (...) will be<br />appended and the string terminated (binary tag data is simply truncated). The<br />actual length of the string (or binary data) is returned (or 0 if no matching<br />value found). Note that with APEv2 text tags the length might not be the same<br />as the number of characters because UTF-8 encoding is used. Also, APEv2 text<br />tags can have multiple (NULL separated) strings for a single value (this is why<br />the length is returned). If this function is called with a NULL "value" pointer<br />(or a zero "length") then only the actual length of the value data is returned<br />(not counting the terminating NULL of text tag items). This can be used to<br />determine the actual memory to be allocated beforehand.<br /><br />For ID3v1 tags the only "item" names supported are "title", "artist", "album",<br />"year", "comment" and "track" (which is converted to numeric text by the<br />library).<br /><br />&nbsp; int WavpackGetTagItemIndexed (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size);<br /><br />&nbsp; int WavpackGetBinaryTagItemIndexed (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size);<br />&nbsp; -------------------------------------------------<br /><br />This function looks up the tag item name by index and is used when the<br />application wants to access all the items in the file's ID3v1 or APEv2 tag.<br />Note that this function accesses only the item's name; WavpackGetTagItem()<br />still must be called to get the actual value. The "size" parameter specifies<br />the amount of space available at "item", if the desired item will not fit in<br />this space then ellipses (...) will be appended and the string terminated.<br />The actual length of the string is returned (or 0 if no item exists for index).<br />If this function is called with a NULL "value" pointer (or a zero "length")<br />then only the actual length of the item name is returned (not counting the<br />terminating NULL). This can be used to determine the actual memory to be<br />allocated beforehand.<br /><br />&nbsp; int WavpackAppendTagItem (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vsize);<br /><br />&nbsp; int WavpackAppendBinaryTagItem (WavpackContext *wpc,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *item,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vsize);<br />&nbsp; ---------------------------------------------<br /><br />This function is used to append (or replace) the specified field to the tag<br />being created or edited. If no tag has been started, then an empty one will be<br />allocated first. When finished adding all the items to the tag, use<br />WavpackWriteTag() to write the completed tag to the file. Note that ID3 tags<br />are not supported. A size parameter is included so that text values containing<br />multiple (NULL separated) strings (and binary data) can be written. A FALSE<br />return indicates an error.<br /><br />&nbsp; int WavpackDeleteTagItem (WavpackContext *wpc, const char *item);<br />&nbsp; ----------------------------------------------------------------<br /><br />Delete the specified tag item from the APEv2 tag being created or edited. This<br />function works with either text or binary fields. Returns TRUE to indicate that<br />an item was actually deleted from the tag.<br /><br />&nbsp; int WavpackWriteTag (WavpackContext *wpc);<br />&nbsp; -----------------------------------------<br /><br />Once a APEv2 tag has been created (or edited) using WavpackAppendTagItem()<br />(and WavpackDeleteTagItem()), this function is used to write the completed tag<br />to the end of the WavPack file. Note that this is NOT done for EACH item in the<br />tag, but only after ALL items have been added to the tag.<br /><br />If this function is called when creating a WavPack file, then it uses the same<br />"blockout" function that is used to write regular WavPack blocks (and should be<br />called after flushing all the audio data and writing any WavPack metadata like<br />RIFF trailers and MD5 sums). It may call the blockout function multiple times<br />to write the tag.<br /><br />If this function is called when editing an existing APEv2 tag, then it will<br />seek to the correct position and write the tag using the WavpackStreamReader<br />function that has been added for this purpose (write_bytes) or using its<br />own standard I/O functions (if the WavpackStreamReader is not being used).<br />Because there is not currently a method implemented to truncate an existing<br />file to a shorter length, this function will pad the file with 0's in front<br />of a tag that had been edited to a shorter length.<br /><br /><br />******************************************************************************<br />**********************&nbsp;&nbsp; 6.0 HANDLING WAVPACK STREAMS&nbsp;&nbsp; **********************<br />******************************************************************************<br /><br />In some applications (for example streaming applications and some filters, or<br />cases where WavPack data might be embedded into another multimedia container)<br />it is required for the audio file parsing functions to be separated from the<br />decoding functions. This is accomplished in two steps with the WavPack library.<br /><br />First, the parsing functions are implemented outside the WavPack library. It is<br />very straightforward to parse WavPack files because the WavPack block header is<br />easy to recognize, and contains easy to parse and interpret information about<br />the block's contents and its relation to the whole WavPack file (or stream). The<br />exact file and block formats are described in detail in the file_format.txt<br />document. The wputils.c module also contains helper functions and a useful<br />seeking function that may also be useful in creating a WavPack parser.<br /><br />Next, the individual parsed blocks are decoded to PCM audio by the library. To<br />accomplish this a "file" is opened with WavpackOpenFileInputEx() where the<br />specified WavpackStreamReader is a function that will feed the raw WavPack<br />block's bytes into the library when requested. The flags parameter should have<br />the OPEN_STREAMING bit set so that the decoder will ignore the position and any<br />other "whole file" information in the block headers. The decoder will suck up<br />the first block (through the stream reader) that actually contains audio and<br />stop, ready to decode. The next step is to call WavpackUnpackSamples() to<br />unpack the actual number of samples in the block (which should be known by the<br />parser).<br /><br />Normally, the entire block would be unpacked and then the decoder would be<br />ready for the next block. If a single additional sample is requested past the<br />size of the current block the decoder will attempt to read the next block, so<br />it is important to request the exact number of samples (unless this behavior is<br />okay). If it is not desired to finish decoding the block then there are two<br />options. The easiest would be to simply decode the rest of the block anyway and<br />discard the results. Another option would be to close the context with the<br />function WavpackCloseFile() and then open another context when needed.<br /><br />This procedure will also work fine for multichannel WavPack files. The decoder<br />will have to suck up all the blocks for the various channels before decoding may<br />begin.<br /><br /><br />******************************************************************************<br />**************************&nbsp;&nbsp; 7.0 ZIP FORMAT USAGE&nbsp;&nbsp; **************************<br />******************************************************************************<br /><br />With version 11.0, WinZip Computing has added WavPack Audio to the official ZIP<br />file format standard as compression method 97, as described here:<br /><br />&nbsp;&nbsp;&nbsp; http://www.winzip.com/ppmd_info.htm<br /><br />The WavPack library can easily be used to create or decode the WavPack images<br />stored in the ZIP files. Some issues to keep in mind:<br /><br />1. Only lossless mode is used. WinZip's implementation uses the "very high"<br />&nbsp;&nbsp; mode with no extra processing, although there is no reason that a different<br />&nbsp;&nbsp; profile could not be employed as they would still be fully compatible (for<br />&nbsp;&nbsp; example, the new "high" mode and/or the new "extra" mode could be used).<br /><br />2. All bitdepths (including 32-bit floating-point) are supported. However,<br />&nbsp;&nbsp; bitdepths that are not multiples of 8 should be rounded up to the next<br />&nbsp;&nbsp; multiple of 8 to ensure that all samples (even illegal ones) are encoded<br />&nbsp;&nbsp; losslessly (this is described in more detail in the WinZip document).<br /><br />3. Multichannel data (with or without WAVEFORMATEXTENSIBLE) is fully supported.<br /><br />4. CONFIG_OPTIMIZE_MONO is not available during decoding and therefore should<br />&nbsp;&nbsp; not be used for encoding.<br /><br />5. The WavPack data must have RIFF headers (to generate .wav files) and may<br />&nbsp;&nbsp; optionally have RIFF trailers. It would not be appropriate to have WavPack<br />&nbsp;&nbsp; generate the RIFF headers (either during encode or decode) because of the<br />&nbsp;&nbsp; obvious danger of generating files that don't match exactly.<br /><br />6. The WavPack data should probably NOT have metadata tags or MD5 sums added<br />&nbsp;&nbsp; to it. This information would be discarded during decoding anyway and could<br />&nbsp;&nbsp; possibly trigger an error condition in a decoder.<br /><br />The easiest way of using the WavPack library to decode the embedded WavPack<br />data would be to open a WavPack context using WavpackOpenFileInputEx() and<br />provide a WavpackStreamReader that would read the appropriate part of the<br />ZIP file by using an offset. If only the standard unpacking operations are<br />used, then the WavPack library will not attempt to seek during a decode. The<br />only flag to use for the "open" call would be OPEN_WRAPPER.<br /><br />The most critical aspect of creating WavPack images to embed in ZIP files is<br />making sure that the decoded data will exactly match the source. This is in<br />contrast to the case of WavPack command-line programs where some invalid WAV<br />files may not encode (or exactly decode) for one reason or another. For this<br />reason it is important to check the parameters in the WAV header carefully and<br />allow only a well-defined set of known good combinations. The size of the audio<br />data should be checked to make sure it contains the correct number of whole<br />composite samples (or if it doesn't then this is properly handled). Since<br />WavPack cannot properly decode WavPack files that contain no audio data (i.e.<br />zero samples), this case should also be avoided. In all situations where some<br />question exists, the prudent choice would be to default to some other (more<br />genereralized) data compression method.<br /><img src ="http://www.cppblog.com/gaimor/aggbug/197786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2013-02-09 18:57 <a href="http://www.cppblog.com/gaimor/archive/2013/02/09/197786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确的ffmpeg链接次序</title><link>http://www.cppblog.com/gaimor/archive/2012/12/29/196818.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sat, 29 Dec 2012 13:33:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2012/12/29/196818.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/196818.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2012/12/29/196818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/196818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/196818.html</trackback:ping><description><![CDATA[libavformat<br />libavcodec<br />libavutil<img src ="http://www.cppblog.com/gaimor/aggbug/196818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2012-12-29 21:33 <a href="http://www.cppblog.com/gaimor/archive/2012/12/29/196818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FFmpeg windows平台编译 - 转载</title><link>http://www.cppblog.com/gaimor/archive/2012/12/29/196815.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Sat, 29 Dec 2012 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2012/12/29/196815.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/196815.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2012/12/29/196815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/196815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/196815.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Arial; line-height: 26px;">FFmpeg是在Linux平台下开发的，但它同样也可以在其它操作系统环境中编译运行，本文介绍的就是在windowsXP下编译FFmpeg。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">一 准备环境：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">1 下载 mingw 和 MSYS</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">去 http://sourceforge.net/projects/mingw/&nbsp; 下载</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">A 点击&#8220;DownLoad mingw-get-inst-...exe&#8221;；</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">B 切换到页面：download? Check your browser's security bar, or try a direct link, or try another mirror. ；</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">C 点击&#8220;direct link&#8221;下载类似：mingw-get-inst-20110802.exe 的文件。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">提示：msys此处就不用下载了，mingw-get-inst-20110802.exe 中已经包含了msys1.0,后面安装的时候就可以看到该选项。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">2 下载 yasm</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">ffmpeg编译里面的汇编代码需要yasm.exe &nbsp;</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">去官网：http://yasm.tortall.net/Download.html 下载</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">直接下载：Win32 .exe (for general use on 32-bit Windows)</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">文件名为：yasm-1.1.0-win32.exe</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">3 下载 ffmpeg</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">ffmpeg可以到 http://www.ffmpeg.org/releases/ 下载</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">本人选择的是最新版本：ffmpeg-0.8.5.tar.gz</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">文件名为：ffmpeg-0.8.5.tar.gz</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">4 下载 SDL</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">SDL下载可以到：http://www.libsdl.org/download-1.2.php</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">选择：SDL-1.2.14.tar.gz - GPG signed</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">此版本需要自己编译，后面会解释为什么下载该版本，而不下载编译好的SDL-devel-1.2.14-mingw32.tar.gz (Mingw32)</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">5 下载 pthreadGC2.dll</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">pthreadgc2.dll 是功能强大的处理数字化影视作品编辑软件premiere6运行所需的一个DLL文件。这是一个无威胁文件。属于Open Source  Software community project的文件。直接去baidu.com三搜索下载就可以了。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">二 编译步骤</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">1 安装 mingw 和 msys</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 执行下载文件：mingw-get-inst-20110802.exe，</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 在第3步选择&#8220;Download latest repository catalogues&#8221;</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 选择安装路径：C:\MinGW（我直接采用默认路径，未做修改）</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 在&#8220;Select Components&#8221;步骤中选择：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#8730;&nbsp; C Compiler (默认且一定选择)</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#8730;&nbsp; C++ Compiler</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#8730;&nbsp; MSYS Basic System（选择此项将会安装msys，msys则不需要另外安装）</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; &#8730;&nbsp; MinGW Developer ToolKit</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 等待安装完成！（需要等待一定的时间，因为安装过程需要下载文件，可想而知，网速越快，安装越快）</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 安装完成后，在C:\MinGW目录下可以看到 msys 文件夹，msys也已经安装。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">2 配置 msys.bat 批处理文件</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 为了方便VS200X以及VS2010调用ffmpeg的动态库，可以通过配置让ffmpeg编译时产生windows下调用dll对应的lib，当然，如果你没有这个需要，那么就可以省略以下处理，直接进入步骤3。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 进入：C:\MinGW\msys\1.0\文件夹，使用UltraEdit打开msys.bat文件，在文件的最最前面加入如下一行：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 其中&#8220;D:\Program Files\Microsoft Visual Studio 10.0&#8221;为你机器上安装VS200X或VS2010的目录，我的电脑安装的是VS2010，并且安装在了D盘。文件修改后保存即可。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">3 配置 yasm</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 为了减少配置环境变量的麻烦，本处直接把 yasm-1.1.0-win32.exe 文件名修改成：yasm.exe，并放到系统目录下：C:\WINDOWS\system32。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">4 解压ffmpeg 与 SDL</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; ffmpeg-0.8.5.tar.gz 的解压目录您可以直接选择，本人解压到：D:\ffmpeg中，解压后目录为：D:\ffmpeg\ffmpeg-0.8.5</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; SDL-1.2.14.tar.tar 解压到 D:\ffmpeg\ffmpeg-0.8.5 目录下，解压后的目录结构为：D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">5 编译SDL</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 双击&#8220;C:\MinGW\msys\1.0\msys.bat&#8221;，启动&#8220;MinGW32&#8221;，</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 切换到SDL目录：D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14，切换方法如下：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd /d</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd ffmpeg</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd ffmpeg-0.8.5</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd SDL-1.2.14</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 再执行以下命令：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ ./configure --prefix=/usr 回车等待&#8230;</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ Make 回车等待&#8230;</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ make install 回车等待&#8230;</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 编译完成后，在C:\MinGW\msys\1.0的bin、include和lib文件夹下可以看到编译结果。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 直接编译ffmpeg时，发现未生成ffplay.exe，</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; configure的时候提示信息如下：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; SDL support&nbsp; no</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 所以需要开启SDL，本人头天接触这东西，不知道使用什么方法可以开启，但通过编译SDL后</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; SDL support&nbsp; yes</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp;  如果你的 SDL  已经是开启状态，你可以直接使用下载中提到的编译好的压缩包SDL-devel-1.2.14-mingw32.tar.gz，直接解压，并把解压包中的 bin、include和lib文件夹中的文件复制到D:\ffmpeg\ffmpeg-0.8.5，与步骤六相同，只是不在从C:\MinGW \msys\1.0中复制。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">6 拷贝编译结果：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; C:\MinGW\msys\1.0&nbsp; 到 c:/mingw下 覆盖</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; bin下的SDL.dll、sdl-config拷贝到 bin中</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; include下的 SDL文件夹拷贝到 include中</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; lib下的libSDL.a、libSDL.dll.a、libSDL.la和libSDLmain.a拷贝到 lib中</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">7 修改sdl-config配置文件</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 使用UltraEdit打开D:\ffmpeg\ffmpeg-0.8.5\bin下的 sdl-config文件</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 把 prefix=/usr 该成： prefix=c:/mingw</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 其中：c:/mingw 为 mingw的安装路径，请根据你的安装进行修改。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">8 编译 ffmpeg</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 双击&#8220;C:\MinGW\msys\1.0\msys.bat&#8221;，启动&#8220;MinGW32&#8221;，</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 切换到SDL目录：D:\ffmpeg\ffmpeg-0.8.5\SDL-1.2.14，</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 切换方法如下：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd /d</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd ffmpeg</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ cd ffmpeg-0.8.5</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 如果你的&#8220;MinGW32&#8221;没有关闭，可以直接切换路径到：D:\ffmpeg\ffmpeg-0.8.5。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 再执行以下命令：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ ./configure --enable-shared --disable-static --enable-memalign-hack</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><p style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 请耐心等待一段时间</p><p style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp; $ make</p><p style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp; 需要等待很长一段时间，等待编译结束。</p><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 为了汇总编译结果，请继续执行以下命令：</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; $ make install</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">&nbsp;&nbsp;&nbsp; 等待完成，在C:\MinGW\msys\1.0\local中将会生成 bin、include、lib等文件夹，其中包含了ffmpeg.exe、ffplay.exe、ffprobe.exe、dll、lib和头文件等。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">9 运行测试</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">直接双击运行&#8221;ffplay.exe&#8221;，如果提示没有&#8220;pthreadGC2.dll&#8221;文件，你可以包&#8220;pthreadGC2.dll&#8221;直接拷贝到当前目录，也可放到系统目录C:\WINDOWS\system32中。</span><br style="color: #333333; font-family: Arial; line-height: 26px;" /><span style="color: #333333; font-family: Arial; line-height: 26px;">avcodec.lib avformat.lib swscale.lib avutil.lib</span><img src ="http://www.cppblog.com/gaimor/aggbug/196815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2012-12-29 19:53 <a href="http://www.cppblog.com/gaimor/archive/2012/12/29/196815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音频混音</title><link>http://www.cppblog.com/gaimor/archive/2012/06/05/177686.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 05 Jun 2012 11:15:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2012/06/05/177686.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/177686.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2012/06/05/177686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/177686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/177686.html</trackback:ping><description><![CDATA[有2种办法<br />第一种是<br />针对输入的数据n bite数据A,B比如short类型<br /><div><span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; list-style-position:initial; color:#800000">If both A and B are negative&nbsp;<span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; list-style-position:initial">Y = A + B - (A * B /  (-(2 pow(n-1) -1)))&nbsp;<br style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; list-style-position:initial; letter-spacing:0px" /> </span>Else&nbsp;<span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; list-style-type:none; list-style-position:initial">Y = A + B - (A * B / (2 pow(n-1)) <br />另外一种办法是采用时间片交替的方式<br /></span></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/177686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2012-06-05 19:15 <a href="http://www.cppblog.com/gaimor/archive/2012/06/05/177686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用libao库播放音乐</title><link>http://www.cppblog.com/gaimor/archive/2012/03/20/168444.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 20 Mar 2012 14:38:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2012/03/20/168444.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/168444.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2012/03/20/168444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/168444.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/168444.html</trackback:ping><description><![CDATA[简单的例子如下:<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">ao</span><span style="color: #000000; ">/</span><span style="color: #000000; ">ao.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">sndfile.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">math.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">argv)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SNDFILE</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;infile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;SF_INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfinfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readcount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">44100</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">(infile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sf_open(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">rock.wav</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,SFM_READ,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sfinfo)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sfinfo.samplerate;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">rate&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,rate);<br />&nbsp;&nbsp;&nbsp;&nbsp;channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sfinfo.channels;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">channels&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,channels);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">format&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,sfinfo.format);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">short</span><span style="color: #000000; ">&nbsp;data[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_device&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">device;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_sample_format&nbsp;format;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;default_driver;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ao_initialize();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;default_driver&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_default_driver_id();<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(format));<br />&nbsp;&nbsp;&nbsp;&nbsp;format.bits&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.channels&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;channels;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.rate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;rate;<br />&nbsp;&nbsp;&nbsp;&nbsp;format.byte_format&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;AO_FMT_LITTLE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;device&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ao_open_live(default_driver,</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">format,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(device&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;NULL)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;opening&nbsp;device.\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">((readcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sf_read_short(infile,data,</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">)))<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao_play(device,data,readcount</span><span style="color: #000000; ">*</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sf_close&nbsp;(infile)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_close(device);<br />&nbsp;&nbsp;&nbsp;&nbsp;ao_shutdown();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />}<br /></span></div><img src ="http://www.cppblog.com/gaimor/aggbug/168444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2012-03-20 22:38 <a href="http://www.cppblog.com/gaimor/archive/2012/03/20/168444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程:Echo音效</title><link>http://www.cppblog.com/gaimor/archive/2011/05/12/146289.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Thu, 12 May 2011 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/12/146289.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/146289.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/12/146289.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/146289.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/146289.html</trackback:ping><description><![CDATA[Echo是声音的反射，是指人直接听到声音之后，其反射音又被听到。<br>一个真正意义上的Echo是单反射的。其时间间隔就是声音的速率<br><br>很显然一般的Echo具有2个参数<br>一个是延迟，一个是衰减<br><br>在某一时刻，人听到的声音是此时音源声音和延迟前音源声音的混合音。<br>显然一个简单的表达式是:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">data</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">data_prev</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">decay</span></div>
这就是Echo音效基本的函数表达式<br><br>这是第四篇关于音效处理的文档<br>其他类似音效不打算再写了<br><br>需要说的就是 实际编程并没有想象中的那么复杂!<br><br>在音频这块喔已经做完了<br>1.acc格式编解码<br>2.wma编解码<br>3.fadein,fadeout,echo,reverb等音效算法<br>4.音频频谱分析<br>5.EQ设置<br><br>有空整理下哈
<img src ="http://www.cppblog.com/gaimor/aggbug/146289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-12 22:18 <a href="http://www.cppblog.com/gaimor/archive/2011/05/12/146289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程(3)-FadeOut和FadeIn音效 </title><link>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 10 May 2011 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/146148.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/146148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/146148.html</trackback:ping><description><![CDATA[这是音效系列编程之三:FadeOut和FadeIn音效<br><br>二者都分别控制音乐的淡出和淡入<br><br>解释下淡出效果的含义:就在是音乐播放即将结束之前通过一定的手法控制音乐响度-直至结束。<br><br>很显然，使用线性关系基本可以达到目的<br>假定数据关系为y = kx + b;<br>另外需要控制淡出的坡度,或者直接说需要知道从结束之前多少个数据开始需要使用FadeOut音效。所以我们需要一个参数len。<br>假定我们使用下列的一句话算法来说明问题:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;len&nbsp;;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;bufer[i]</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">i)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b;</span></div>
其中a,b为待定参数<br>因为有一个前提:当i = len-1的时候buffer[len-1] = 0;<br>所以有a=len-1<br>另外当fadeout发挥作用之前buffer数据并未变化，故有<br>b=(len-1)<br>故基本的Fadeout核心算法就是一句:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">t</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k)</span></div>
简单吧。<br>理所当然<br>基本的FadeIn核心算法就是<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">y</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span></div>
<p>虽然在具体场合，算法有所变形，但是基本的原理就是这个样子<br><br>PS:基本的函数关系虽然简单，但是比较实用</p>
<p>以后有空还会讲Echo,Reverb,Treble Booster,Compressor,High Filter等音效原理<br>。只是研究音效的同志们不多。没的讨论<br>&nbsp;</p>
<img src ="http://www.cppblog.com/gaimor/aggbug/146148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-05-10 23:14 <a href="http://www.cppblog.com/gaimor/archive/2011/05/10/146148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程二:Tremolo音效</title><link>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Tue, 26 Apr 2011 14:42:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145089.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145089.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145089.html</trackback:ping><description><![CDATA[接上文.<br>Tremolo音效比较酷的音效，听上去感觉是使用电子乐器演示的。<br>从感官上将Tremolo(颤音)音效是重击一个音符然后快速提高，减小音量<br><br>下面是颤音音效的几个参数:<br>1.深度控制:用来控制音量增减速度<br>2.阈值数据:说明控制音量的频率值<br>3.波形<br><br>其基本数学表达式为:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;data&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;sin(k</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;index));</span></div>
<br>简易的c++代码如下:<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Tremolo&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;def_depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;def_rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;k;<br>&nbsp;&nbsp;&nbsp;&nbsp;Tremole();<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;_data)<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;data.size();i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]&nbsp;</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;sin(</span><span style="COLOR: #000000">2.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;PI&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;k);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;data;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br>};</span></div>
当然有java版本的化应该是如下这个样子:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Tremolo&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;def_depth&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;def_rate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;depth&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;def_depth;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;rate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;def_rate;<br>&nbsp;&nbsp;&nbsp;&nbsp;Tremolo()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;Filter(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;_data)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data.length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[]&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[len];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_data[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">depth</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Math.Sin(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Math.PI</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">rate</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">k));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ret;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
基本的源码就这个样子<br>不过有一个问题就是播放音效有少许杂音-不过不是大问题
<img src ="http://www.cppblog.com/gaimor/aggbug/145089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-04-26 22:42 <a href="http://www.cppblog.com/gaimor/archive/2011/04/26/145089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>音效编程(1)-Distortion音效</title><link>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html</link><dc:creator>ccsdu2009</dc:creator><author>ccsdu2009</author><pubDate>Mon, 25 Apr 2011 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html</guid><wfw:comment>http://www.cppblog.com/gaimor/comments/145002.html</wfw:comment><comments>http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/gaimor/comments/commentRss/145002.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/gaimor/services/trackbacks/145002.html</trackback:ping><description><![CDATA[<p>之前做的音频API都是使用的第三方的库或者代码<br>不过这段时间一直比较忙<br>没什么时间来玩玩音频引擎了<br><br>不过为了不至于本博客长草<br>我就整理下以前接触过的音频处理这块吧<br><br>首先上一个简单的音效基类吧</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">AudioEffect(){}<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;data)&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;<br>};</span></div>
<br>通过调用Filter就可以获取给定pcm处理后的音效数据<br><br>然后再谈下什么是Distortion音效<br>Distortion主要使用于电吉他等电子类乐器，<br><br>Distortion音效主要有以下参数:<br>1.edge 临界值<br>2.gain 增益<br>3.低通剪切值(当然还有其他几个参数,...)<br><br>其简易化的音效处理原则就是<br>使用使用给定临界值对原有数据做Clamp处理<br><br>简单的例子如下:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DISTORTION_RATE&nbsp;100.0</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DISTORTION_THRESHOLD&nbsp;0.4</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Distortion&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AudioEffect<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Distortion()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DISTORTION_RATE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DISTORTION_THRESHOLD;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Filter(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;&amp;</span><span style="COLOR: #000000">&nbsp;data_)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">data.clear();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;data_.size();&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;data_[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">gain;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(v&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(v&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.push_back(v);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reutrn&nbsp;data;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;gain;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;value;<br>};</span></div>
<br>看上去似乎很简单<br><br>那处理后的音效如何? 试试就知道了<br><br>接下来还有reverb,ring,echo,chorus等音效算法和音频傅里叶变换等<br>等弄完了这些，音频引擎也就该升级了(我早已构思好了下个版本的音频API功能了)<br><br>下篇tremolo音效
<img src ="http://www.cppblog.com/gaimor/aggbug/145002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/gaimor/" target="_blank">ccsdu2009</a> 2011-04-25 22:48 <a href="http://www.cppblog.com/gaimor/archive/2011/04/25/145002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>