科尔沁左翼中旗| 额敏| 乐亭| 名山| 临桂| 灵石| 淮安| 萍乡| 潞城| 福山| 景县| 宝安| 南华| 大港| 迁安| 汉寿| 巴中| 保康| 长武| 龙里| 贡山| 河津| 博罗| 崇左| 分宜| 高县| 望奎| 龙山| 沐川| 江阴| 绍兴市| 庐山| 宜宾市| 六安| 天峻| 衢江| 邻水| 三河| 高州| 邵东| 菏泽| 东阿| 绥江| 五莲| 北流| 乌兰浩特| 芜湖县| 广安| 唐县| 依安| 屏边| 阳西| 乌达| 长春| 清流| 广丰| 同江| 香河| 安县| 金湖| 四会| 舞钢| 霍邱| 墨脱| 甘棠镇| 阿拉善右旗| 漾濞| 广东| 雅安| 壶关| 安丘| 桐城| 桂平| 平南| 青岛| 曲沃| 文山| 包头| 砚山| 屏山| 甘南| 勐腊| 麻江| 乐东| 隰县| 赵县| 正定| 四会| 琼中| 洛阳| 凯里| 淄川| 碌曲| 炎陵| 耒阳| 瓦房店| 平房| 惠来| 大名| 徐州| 乌兰| 辛集| 乳源| 张掖| 乾县| 朝阳县| 宜宾市| 克拉玛依| 阿克塞| 惠水| 东山| 宜宾县| 抚州| 望奎| 朝阳县| 合川| 松江| 龙里| 长子| 亳州| 新野| 杞县| 栖霞| 怀远| 奎屯| 百色| 岑巩| 九龙| 宿州| 兴文| 福鼎| 山阴| 三江| 南江| 环县| 肇州| 万州| 合肥| 仙游| 定日| 彭水| 小河| 扎兰屯| 郫县| 祁东| 马鞍山| 卫辉| 石城| 高州| 慈溪| 泉港| 敦煌| 松潘| 奉化| 嘉鱼| 合肥| 本溪满族自治县| 赤城| 大兴| 麦盖提| 新邵| 陆川| 德江| 青县| 扶绥| 黔江| 萨嘎| 延长| 兰坪| 磴口| 凤城| 章丘| 杂多| 美姑| 阿合奇| 察哈尔右翼中旗| 大竹| 木里| 朔州| 下陆| 鹰潭| 田阳| 如皋| 舒兰| 江西| 莱西| 会泽| 石泉| 靖江| 天全| 鄂尔多斯| 方城| 巴东| 左贡| 武鸣| 高县| 那坡| 新宾| 三台| 科尔沁左翼中旗| 阳新| 广宁| 桦甸| 金口河| 乡宁| 安多| 双柏| 普宁| 罗源| 迭部| 赵县| 光山| 莘县| 温泉| 贵定| 澄城| 湘乡| 阳江| 清徐| 蛟河| 榆社| 广安| 陕西| 大石桥| 雁山| 梁平| 建德| 锦州| 嘉峪关| 麻山| 南通| 建湖| 曹县| 澳门老葡京赌城 bet365 网址小睹怡情 银河开户 小睹怡情 ag平台总代 永利赌城充值 澳门威尼斯网址 新葡京网站3648 新葡京官方赌场直营 皇家娱乐在线 永利官网误乐域 重庆时时彩 aipin点me MG电子游戏 游艇会官网 威尼斯赌场送彩金 澳门游戏网站大全 葡京网站赌场 葡京在哪里 澳门葡京黄色bbb 葡京在哪里 28365365体育投注真人备用 bet16瑞丰乐投 德州扑克游戏平台 凯旋门游戏赌场 美高梅官网 葡京捕鱼 扎金花规则 斗牛游戏外挂 ag娱乐网站 葡京网站 葡京官方赌场 博九娱乐网站 澳门官方赌博 金沙澳门官网 澳门葡京国际娱乐 上葡京登录

威尼斯人酒店登录:

2018-12-14 22:48 来源:新浪中医

  威尼斯人酒店登录:

  威尼斯注册网站这个真诚的愿望,已经为我们的实际行动所证明,中国决不会以牺牲别国利益为代价来发展自己,中国发展不对任何国家构成威胁,中国永远不称霸、永远不搞扩张。不管是哪个国家的人民,都怀着过上幸福美好生活的梦想,和平、发展、合作、共赢的时代潮流势不可挡,构建人类命运共同体是必由之路。

  公开资料显示,汕头大学是1981年经国务院批准成立的综合性大学,是教育部、广东省、李嘉诚基金会三方共建的大学,也是全球唯一一所由私人基金会李嘉诚基金会持续资助的公立大学。  注意!月收入增长较慢的十大职业类  月收入及其涨幅与生活水平和生活质量直接挂钩,但受各方面因素影响,不同职业类月收入增长情况不同。

    回望过去,本人自1950年创业开始,1972年长江实业(集团)有限公司上市,于过去68年间,一直带领长江集团稳步发展,经内部增长及收购合并,积极拓展业务及收益多元化与全球化,并适时作策略性检视以及重组,尽心尽力为股东争取最佳利益及回报增值,本人衷心感谢各股东多年来对本人的支持及信任。  绵阳熊猫总数渐增数量位居全国第一  早在2015年,就有关于游客在平武偶遇野生大熊猫的报道。

  六是对工作条件特别艰苦或岗位职责重、压力大的基层高校毕业生,适时组织交流或轮岗。  首先,对首都机场的早出港航班进行了调减,调减方案结合了各公司航班量和实际运行情况。

  此次,农业农村部领导班子新增两张新面孔:中央农村工作领导小组办公室主任韩俊、副主任吴宏耀双双调入。

  专项抓好人防工程易地建设审批管理,加大对市属国有企业重大收购、投资、出借资金行为的监管。

  到2016年,李嘉诚回应退休问题时又表示:说没想过就是骗你的,又强调自己随时可以退休,不担心公司日后运作。  重点  问题出在哪儿?  对一级党委进行改组是最严厉的问责手段  蔡奇指出,农产品中央批发市场管委会党委发生的严重问题,教训极其深刻。

    据2017年底北京市政府公布的数据,北京市现有政府网站1042个,其中市政府门户网站1个;市级部门网站95个,垂直管理单位网站115个;16个区和北京经济技术开发区有网站831个。

    往后,应董事会要求,本人同意出任公司资深顾问,冀为集团继续作出贡献,就重大事项提供意见。  加大对创新团队和优秀人才的奖励力度。

  这是人民拥护核心、爱戴领袖最真挚的表达。

  新葡京赌场网站  6、让人民群众在每一个司法案件中感受到公平正义  要坚持在法治轨道上统筹社会力量、平衡社会利益、调节社会关系、规范社会行为、化解社会矛盾,以良法促发展、保善治,让人民群众在每一个司法案件中感受到公平正义,使尊法学法守法用法成为广大人民群众共同追求,确保社会在深刻变革中既生机勃勃又井然有序。

  在研制团队的拼搏下,开创了当年定型、当年批量装备部队的先河。模型所形成的指数反应了该专业目前的综合就业竞争力。

  澳门威尼斯注册 葡京官方平台 葡京在线

  威尼斯人酒店登录:

 
责编:
Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2182258
  • 博文数量: 849
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8135
  • 用 户 组: 普通用户
  • 注册时间: 2018-12-14 09:59
  • 认证徽章:
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(849)

文章存档

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(273)

2010年(1)

2009年(54)

2008年(66)

2007年(49)

2006年(82)

2005年(12)

分类: Android平台

2018-12-14 21:27:22

特定于平台的声音生成

新葡京网投存款   首先,对首都机场的早出港航班进行了调减,调减方案结合了各公司航班量和实际运行情况。

现在为了本章的真正目的:给MonkeyTap发声。所有三个平台都支持API,允许程序动态生成和播放音频波形。这是MonkeyTapWithSound程序采用的方法。
商业音乐文件通常以诸如MP3之类的格式压缩。但是当一个程序算法算法生成波形时,未压缩的格式会更加方便。最基本的技术 - 所有三个平台都支持 - 称为脉冲编码调制或PCM。除了花哨的名字,它很简单,它是用于在音乐CD上存储声音的技术。
PCM波形由一系列恒定速率的样本描述,称为采样率。音乐CD使用标准速率为每秒44,100个样本。如果不需要高音质,计算机程序生成的音频文件通常使用一半(22,050)或四分之一(11,025)的采样率。可记录和再现的最高频率是采样率的一半。
每个样本都是固定大小,用于定义该时间点波形的幅度。音乐CD上的样本是带符号的16位值。当声音质量无关紧要时,8位样本很常见。某些环境支持浮点值。多个样本可以容纳立体声或任意数量的声道。对于移动设备上的简单音效,单声道声音通常很好。
MonkeyTapWithSound中的声音生成算法是针对16位单声道样本进行硬编码的,但采样率由常量指定,并且可以轻松更改。
现在您已经了解了DependencyService的工作原理,让我们检查添加到MonkeyTap的代码,将其转换为MonkeyTapWithSound,让我们从上到下看一下。为避免重现大量代码,新项目包含MonkeyTap项目中MonkeyTap.xaml和MonkeyTap.xaml.cs文件的链接。
在Visual Studio中,通过从项目菜单中选择“添加”>“现有项”,可以将项目添加为项目作为现有文件的链接。然后使用“添加现有项”对话框导航到该文件。从“添加”按钮的下拉列表中选择“添加为链接”。
在Xamarin Studio中,从项目的工具菜单中选择添加>添加文件。打开文件后,会弹出“添加文件到文件夹”警告框。选择“添加指向该文件的链接”。
但是,在Visual Studio中执行这些步骤后,还需要手动编辑Mon?keyTapWithSound.csproj文件,以将MonkeyTapPage.xaml文件更改为EmbeddedResource,将Generator更改为MSBuild:UpdateDesignTimeXaml。此外,还将一个DependentUpon标记添加到MonkeyTapPage.xaml.cs文件中以引用MonkeyTapPage.xaml文件。这会导致代码隐藏文件在文件列表中的XAML文件下缩进。
然后,MonkeyTapWithSoundPage类派生自MonkeyTapPage类。虽然MonkeyTapPage类是由XAML文件和代码隐藏文件定义的,但MonkeyTapWithSoundPage仅是代码。当以这种方式派生类时,必须将XAML文件中的事件的原始代码隐藏文件中的事件处理程序定义为受保护的,这是这种情况。
MonkeyTap类还将flashDuration常量定义为protected,并将两个方法定义为protected和virtual。 MonkeyTapWithSoundPage重写这两个方法来调用一个名为SoundPlayer.PlaySound的静态方法:

namespace MonkeyTapWithSound
{
    class MonkeyTapWithSoundPage : MonkeyTap.MonkeyTapPage
    {
        const int errorDuration = 500;
        // Diminished 7th in 1st inversion: C, Eb, F#, A
        double[] frequencies = { 523.25, 622.25, 739.99, 880 };
        protected override void BlinkBoxView(int index)
        {
            SoundPlayer.PlaySound(frequencies[index], flashDuration);
            base.BlinkBoxView(index);
        }
        protected override void EndGame()
        {
            SoundPlayer.PlaySound(65.4, errorDuration);
            base.EndGame();
        }
    }
}

SoundPlayer.PlaySound方法接受频率和持续时间(以毫秒为单位)。 每一件事 - 音量,声音的谐波组成以及声音是如何产生的 - 都是PlaySound方法的责任。 但是,此代码隐含地假设SoundPlayer.PlaySound立即返回,并且不等待声音完成播放。 幸运的是,所有这三个平台都支持以这种方式运行的声音生成API。
使用PlaySound静态方法的SoundPlayer类是MonkeyTapWithSound PCL项目的一部分。 此方法的职责是为声音定义PCM数据的数组。 此数组的大小取决于采样率和持续时间。 for循环计算定义所请求频率的三角波的样本:

namespace MonkeyTapWithSound
{
    class SoundPlayer
    {
        const int samplingRate = 22050;
        /* Hard-coded for monaural, 16-bit-per-sample PCM */
        public static void PlaySound( double frequency = 440, int duration = 250 )
        {
            short[] shortBuffer    = new short[samplingRate * duration / 1000];
            double    angleIncrement    = frequency / samplingRate;
            double    angle        = 0; /* normalized 0 to 1 */
            for ( int i = 0; i < shortBuffer.Length; i++ )
            {
                /* Define triangle wave */
                double sample;
                /* 0 to 1 */
                if ( angle < 0.25 )
                    sample = 4 * angle;
                /* 1 to -1 */
                else if ( angle < 0.75 )
                    sample = 4 * (0.5 - angle);
                /* -1 to 0 */
                else
                    sample = 4 * (angle - 1);
                shortBuffer[i]    = (short) (32767 * sample);
                angle        += angleIncrement;
                while ( angle > 1 )
                    angle -= 1;
            }
            byte[] byteBuffer = new byte[2 * shortBuffer.Length];
            Buffer.BlockCopy( shortBuffer, 0, byteBuffer, 0, byteBuffer.Length );
            DependencyService.Get().PlaySound( samplingRate, byteBuffer );
        }
    }
} 

虽然样本是16位整数,但是其中两个平台希望数据以字节数组的形式存在,因此使用Buffer.BlockCopy在末尾附近进行转换。 该方法的最后一行使用DependencyService将具有采样率的此字节数组传递给各个平台。
DependencyService.Get方法引用IPlatformSoundPlayer接口,该接口定义了PlaySound方法的签名:

namespace MonkeyTapWithSound
{
    public interface IPlatformSoundPlayer
    {
        void PlaySound(int samplingRate, byte[] pcmData);
    }
}

现在来了困难的部分:为三个平台编写这个PlaySound方法!
iOS版本使用AVAudioPlayer,它需要包含Wave?form音频文件格式(.wav)文件中使用的标头的数据。 这里的代码汇编了MemoryBuffer中的数据,然后将其转换为NSData对象:

using System;
using System.IO;
using System.Text;
using Xamarin.Forms;
using AVFoundation;
using Foundation;
[assembly: Dependency( typeof(MonkeyTapWithSound.iOS.PlatformSoundPlayer) )]
namespace MonkeyTapWithSound.iOS
{
    public class PlatformSoundPlayer : IPlatformSoundPlayer
    {
        const int    numChannels    = 1;
        const int    bitsPerSample    = 16;
        public void PlaySound( int samplingRate, byte[] pcmData )
        {
            int        numSamples    = pcmData.Length / (bitsPerSample / 8);
            MemoryStream    memoryStream    = new MemoryStream();
            BinaryWriter    writer        = new BinaryWriter( memoryStream, Encoding.ASCII );
            /* Construct WAVE header. */
            writer.Write( new char[] { 'R', 'I', 'F', 'F' } );
            writer.Write( 36 + sizeof(short) * numSamples );
            writer.Write( new char[] { 'W', 'A', 'V', 'E' } );
            writer.Write( new char[] { 'f', 'm', 't', ' ' } );              /* format chunk */
            writer.Write( 16 );                                             /* PCM chunk size */
            writer.Write( (short) 1 );                                      /* PCM format flag */
            writer.Write( (short) numChannels );
            writer.Write( samplingRate );
            writer.Write( samplingRate * numChannels * bitsPerSample / 8 ); /* byte rate */
            writer.Write( (short) (numChannels * bitsPerSample / 8) );      /* block align */
            writer.Write( (short) bitsPerSample );
            writer.Write( new char[] { 'd', 'a', 't', 'a' } );              /* data chunk */
            writer.Write( numSamples * numChannels * bitsPerSample / 8 );
            /* Write data as well. */
            writer.Write( pcmData, 0, pcmData.Length );
            memoryStream.Seek( 0, SeekOrigin.Begin );
            NSData        data        = NSData.FromStream( memoryStream );
            AVAudioPlayer    audioPlayer    = AVAudioPlayer.FromData( data );
            audioPlayer.Play();
        }
    }
}

请注意两个要点:PlatformSoundPlayer实现IPlatformSoundPlayer接口,并使用Dependency属性标记类。
Android版本使用AudioTrack类,结果更容易一些。 但是,AudioTrack对象不能重叠,所以有必要保存前一个对象并停止播放,然后开始下一个对象:

using System;
using Android.Media;
using Xamarin.Forms;
[assembly: Dependency( typeof(MonkeyTapWithSound.Droid.PlatformSoundPlayer) )]
namespace MonkeyTapWithSound.Droid
{
    public class PlatformSoundPlayer : IPlatformSoundPlayer
    {
        AudioTrack previousAudioTrack;
        public void PlaySound( int samplingRate, byte[] pcmData )
        {
            if ( previousAudioTrack != null )
            {
                previousAudioTrack.Stop();
                previousAudioTrack.Release();
            }
            AudioTrack audioTrack = new AudioTrack( Stream.Music,
                                samplingRate,
                                ChannelOut.Mono,
                                Android.Media.Encoding.Pcm16bit,
                                pcmData.Length * sizeof(short),
                                AudioTrackMode.Static );
            audioTrack.Write( pcmData, 0, pcmData.Length );
            audioTrack.Play();
            previousAudioTrack = audioTrack;
        }
    }
}

三个Windows和Windows Phone平台可以使用MediaStreamSource。 为了避免大量重复代码,MonkeyTapWithSound解决方案包含一个名为WinRuntimeShared的额外SAP项目,该项目仅由三个平台都可以使用的类组成:

using System;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Media.Core;
using Windows.Media.MediaProperties;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;
namespace MonkeyTapWithSound.WinRuntimeShared
{
    public class SharedSoundPlayer
    {
        MediaElement    mediaElement = new MediaElement();
        TimeSpan    duration;
        public void PlaySound( int samplingRate, byte[] pcmData )
        {
            AudioEncodingProperties audioProps =
                AudioEncodingProperties.CreatePcm( (uint) samplingRate, 1, 16 );
            AudioStreamDescriptor    audioDesc    = new AudioStreamDescriptor( audioProps );
            MediaStreamSource    mss        = new MediaStreamSource( audioDesc );
            bool            samplePlayed    = false;
            mss.SampleRequested += (sender, args) =>
            {
                if ( samplePlayed )
                    return;
                IBuffer            ibuffer = pcmData.AsBuffer();
                MediaStreamSample    sample    =
                    MediaStreamSample.CreateFromBuffer( ibuffer, TimeSpan.Zero );
                sample.Duration        = TimeSpan.FromSeconds( pcmData.Length / 2.0 / samplingRate );
                args.Request.Sample    = sample;
                samplePlayed        = true;
            };
            mediaElement.SetMediaStreamSource( mss );
        }
    }
}

此SAP项目由三个Windows和Windows Phone项目引用,每个项目包含相同的(命名空间除外)PlatformSoundPlayer类:

using System;
using Xamarin.Forms;
[assembly: Dependency( typeof(MonkeyTapWithSound.UWP.PlatformSoundPlayer) )]
namespace MonkeyTapWithSound.UWP
{
    public class PlatformSoundPlayer : IPlatformSoundPlayer
    {
        WinRuntimeShared.SharedSoundPlayer sharedSoundPlayer;
        public void PlaySound( int samplingRate, byte[] pcmData )
        {
            if ( sharedSoundPlayer == null )
            {
                sharedSoundPlayer = new WinRuntimeShared.SharedSoundPlayer();
            }
            sharedSoundPlayer.PlaySound( samplingRate, pcmData );
        }
    }
}

使用DependencyService来执行特定于平台的杂务是非常强大的,但是当涉及到用户界面元素时,这种方法不足。 如果您需要扩展装饰Xamarin.Forms应用程序页面的视图库,那么这项工作涉及创建特定于平台的渲染器,这是本书最后一章中讨论的过程。

阅读(6820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

注册

ag捕鱼王二代技巧攻略 威尼斯人平台怎么样 如意娱乐登陆网址 美高梅注册送体验金 澳门百乐门官网直营
bet16瑞丰娱乐 美高梅网址 永鑫娱乐官方网站 澳门新金沙 宏搏天下平台 现金网上赌场
澳门威尼斯注册网站 威尼斯人网上赌场诈骗 24小时娱乐城 bbin平台大全 澳门网上正规赌场
新大陆娱乐 新濠娱乐 威尼斯娱乐 葡京网上投注 葡京线上开户