坑爹的 AudioRecorder 的 setPositionMarker

from stackOverFlow

太坑了。。。

My Android Java Application needs to record audio data into the RAM and process it. This is why I use the class “AudioRecord” and not the “MediaRecorder” (records only to file).

Till now, I used a busy loop polling with “read()” for the audio data. this has been working so far, but it peggs the CPU too much. Between two polls, I put the thread to sleep to avoid 100% CPU usage. However, this is not really a clean solution, since the time of the sleep is not guaranteed and you must subtract a security time in order not to loose audio snippets. This is not CPU optimal. I need as many free CPU cycles as possible for a parallel running thread.

Now I implemented the recording using the “OnRecordPositionUpdateListener”. This looks very promising and the right way to do it according the SDK Docs. Everything seems to work (opening the audio device, read()ing the data etc.) but the Listner is never called.

Does anybody know why?

Info: I am working with a real Device, not under the Emulator. The Recording using a Busy Loop basically works (however not satifiying). Only the Callback Listener is never called.

Here is a snippet from my Sourcecode:

 

public class myApplication extends Activity {

  /* audio recording */
  private static final int AUDIO_SAMPLE_FREQ = 16000;
  private static final int AUDIO_BUFFER_BYTESIZE = AUDIO_SAMPLE_FREQ * 2 * 3; // = 3000ms
  private static final int AUDIO_BUFFER_SAMPLEREAD_SIZE = AUDIO_SAMPLE_FREQ  / 10 * 2; // = 200ms

  private short[] mAudioBuffer = null; // audio buffer
  private int mSamplesRead; // how many samples are recently read
  private AudioRecord mAudioRecorder; // Audio Recorder

  ...

  private OnRecordPositionUpdateListener mRecordListener = new OnRecordPositionUpdateListener() {

    public void onPeriodicNotification(AudioRecord recorder) {
      mSamplesRead = recorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);
      if (mSamplesRead > 0) {

        // do something here...

      }
    }

    public void onMarkerReached(AudioRecord recorder) {
      Error("What? Hu!? Where am I?");
    }
  };

  ...

  public void onCreate(Bundle savedInstanceState) {

  try {
      mAudioRecorder = new AudioRecord(
          android.media.MediaRecorder.AudioSource.MIC,
          AUDIO_SAMPLE_FREQ,
          AudioFormat.CHANNEL_CONFIGURATION_MONO,
          AudioFormat.ENCODING_PCM_16BIT,
          AUDIO_BUFFER_BYTESIZE);
    } catch (Exception e) {
      Error("Unable to init audio recording!");
    }

    mAudioBuffer = new short[AUDIO_BUFFER_SAMPLEREAD_SIZE];
    mAudioRecorder.setPositionNotificationPeriod(AUDIO_BUFFER_SAMPLEREAD_SIZE);
    mAudioRecorder.setRecordPositionUpdateListener(mRecordListener);
    mAudioRecorder.startRecording();

    /* test if I can read anything at all... (and yes, this here works!) */
    mSamplesRead = mAudioRecorder.read(mAudioBuffer, 0, AUDIO_BUFFER_SAMPLEREAD_SIZE);

  }
}

Answer:

I believe the problem is that you still need to do the read loop. If you setup callbacks, they will fire when you’ve read the number of frames that you specify for the callbacks. But you still need to do the reads. I’ve tried this and the callbacks get called just fine. Setting up a marker causes a callback when that number of frames has been read since the start of recording. In other words, you could set the marker far into the future, after many of your reads, and it will fire then. You can set the period to some bigger number of frames and that callback will fire every time that number of frames has been read. I think they do this so you can do low-level processing of the raw data in a tight loop, then every so often your callback can do summary-level processing. You could use the marker to make it easier to decide when to stop recording (instead of counting in the read loop).

 

 

金庸小说里男女不能结婚的理由(这个太搞了。。。哈哈)

衡山派掌门人莫大先生一直没有婚娶。有一回群雄聚会,刘正风忍不住问他:”师兄,你都一把年纪了,怎么还不娶妻生娃呢?” 莫大先生眼睛半开半闭,拉着他的胡琴,慢悠悠地说出一番话来:  
  
要说成婚哪,  
  
首先得找个女人,对吧?婚姻本来就是男人和女人的事。――东方不败脸色一沉,绣花的手倏然停下。  
  
那么找个什么样的女人好呢?你要是找个难看的,这辈子心里都不平衡。――平一指四处打量,开始物色病人。  
  
要是找个好看的呢,等着认一群襟兄襟弟吧。――吴三桂摸了摸鼻子。  
  
有明着来抢的,――杨铁心默然不语。  
  
有暗着来偷的,――苗人凤拍案而起。   继续阅读“金庸小说里男女不能结婚的理由(这个太搞了。。。哈哈)”

The Crowd(乌合之众) 摘录及有感

现代心理学所确认的真理,即无意识现象不但在有机体的生活中,而且在智力活动中,都发挥着一种完全压倒性的作用。与精神生活中的无意识因素相比,有意识因素只起着很小的作用。

人们在智力上差异最大,但他们却有着非常相似的本能和情感.在属于情感领域的每一种事情上–宗教,政治,道德,爱憎等等,最杰出的人士很少能比凡夫俗子高明多少.

这是接近他们,打入他们圈子的要点,呵呵.非常聪明非常成功的人拥有着相当的情感.这是他们的弱点.

群体中累加在一起的只有愚蠢而不是天生的智慧.

有意识人格的消失,无意识人格的得势,思想和感情因暗示和相互传染作用而转向一个共同的方向,以及立刻把暗示的观念转化为行动的倾向,是组成群体的个人所表现出来的主要特点。

群体 冲动,易变,急燥,易受暗示和轻信,情绪的夸张与单纯,偏执,专横与保守。道德会很高,也可能截然相反。

每一种文明都是屈指可数的几个基本观念的产物,这些观念很少受到革新。这些观念在群体心中是多么根深蒂固,影响这一过程是多么困难,以及这些观念一旦得到落实所具有的力量。历史大动荡就是这些基本观念的变化所引发的结果。

我们现在到这个关头了吗?我们的基本观念变化了吗?我们公共道德的缺失,唯利是图的观念是否已经深入人心,改变了多年来的纯朴,正直的心呢?唉。。。

给群体提供的无论是什么观念,只有当它们具有绝对的,毫不妥协的简单明了的形式时,才能产生有效的影响。

群众的逻辑能力,推理能力是非常简单甚至拙劣的。

群体推理的特点,是把彼此不同,只在表面上相似的事物搅在一起,并且立刻把具体的事物普遍化。

正像缺乏推理能力的人一样,群体形象化的想像力不但强大而活跃,并且非常敏感。

一种感情,比如对想象中某个高高在上者的崇拜,对生命赖以存在的某种力量的畏惧,盲目服从它的命令,没有能力对其信条展开讨论,传播这种信条的愿望,倾向于把不接受它们的任何人视为仇敌。这种感情所涉及的不管是一个看不见的上帝,一具木头或石头偶像,还是某个英雄或政治观念,只要它具有上述特点,它便总是有着宗教的本质

就像当年成立新中国时对毛zd的崇拜一样,那也是宗教。也明白当年为何对法 – 轮 -gong 如此的狠了。宗教的力量太恐怖了。中世纪欧洲的政教一体太刚了。。。其实,也就是从79年,中国改革开放,才慢慢放下对共chandang,对毛zd的崇拜。转眼30年,其实这30年党一直在培养党是人民的信仰,但是没有成功,导致人们没有信仰。信仰的缺失,会造成什么后果?就是现在这样子吗?现在人们的信仰是钱吗?台湾也是87年戒严结束,几乎长达半个世纪的戒严。然后飞速发展。228事件真的太恶劣了,难怪国民党失去了民心。从这一点看,没有理由说如果由国民党统治的话,我们的生活会变的更好。但也不好说。。。毕竟是资本主义。。。毕竟中国特色的社会主义迷惑性太强。。。

一切宗教或政治信条的创立者所以能够立住脚,皆因为他们成功地激起了群众想入非非的感情,他们使群众在崇拜和服从中,找到了自己的幸福,随时准备为自己的偶像赴汤蹈火。这在任何时代概无例外。

同理性永恒的冲突中,失败的从来就不是感情。

选民群体,表达的不过是一个种族无意识的向往和需要。在每个国家,当选者的一般意见都反映着种族的禀性,而我们看到,这种禀性从一代人到下一代人,不会有显著的变化。

领袖很少超前于民意,他所做的一切几乎总是在顺应民意,因此也会助长其中的所有错误。

群体的产品不管性质如何,与孤立的个人的产品相比,总是品质低劣的。

我们现在的产品是不是参于讨论的人太多了?呵呵。希望我们的产品能快速成长起来。

终于为开源做了点贡献

http://code.google.com/p/drum-practice/

用scala写了个android小游戏,练习架子鼓的,希望能对大家有些帮助。总算了了一桩心劫。呵呵。虽然没多少人会看到,但总归是做了,问心无愧了。呵呵。

Android 截取圆形图片核心代码

好用,呵呵(http://www.eoeandroid.com/thread-103093-1-1.html)

 

int targetWidth = 100;
int targetHeight = 100;
Bitmap targetBitmap = Bitmap.createBitmap(
targetWidth,
targetHeight,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(targetBitmap);
Path path = new Path();
path.addCircle(
((float)targetWidth - 1) / 2,
((float)targetHeight - 1) / 2,
(Math.min(((float)targetWidth), ((float)targetHeight)) / 2),
Path.Direction.CCW);
canvas.clipPath(path);
Bitmap sourceBitmap = BitmapFactory.decodeResource(
getResources(),
R.drawable.my_image);
canvas.drawBitmap(
sourceBitmap,
new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()),
new Rect(0, 0, targetWidth, targetHeight),
null);
ImageView imageView = (ImageView)findViewById(R.id.my_image_view);
imageView.setImageBitmap(targetBitmap);

 

 

对K歌即 音乐社交的想法

唱歌是硬需求。这是第一点。

如何做好。呵呵。先说唱吧:

简单的用了一下。产品是不错,有美女图片,优质用户会很爽,因为一旦被推荐,就会有N千人关注并评论,但是普通人就没有被激励,而且不容易发现朋友。

我们要激励,拉动中间层的用户,这才是绝大部分用户所在。让他们互相发现,互相认识,互相欣赏,然后发展成线下的朋友,才是最有魅力的地方。

昨夜久久不能成眠。想了一下音乐社交的功能点。

1.找歌,唱歌

2.看朋友的歌。并与朋友互动。类似广播和墙一样。可以有三种展示模式:1.按好友,每个好友一条信息,显示最近发的歌曲。2.按歌曲,所有的好友最新发的歌曲按时间排序。3.类似论坛模式,按最新发布及评论来排序。

3.发现朋友这应该是当前所有音乐app都没有做好的地方。但也应该是最精华的地方。展示方式也可以是墙,如果可能的话,按地点,按性别,按共同喜好去推荐陌生人。看到的是陌生人唱的歌,然后引导其去加好友。一定要在这里推荐普通的用户,让大家都能玩起来,而不是让精英用户很high,而其它用户只是千万只手中的一只。

4.向本地ktv实体店的引导,引导其去附近ktv唱歌,可以谈合作,谈优惠,也可以算是一种盈利模式吧。ktv音乐软件代替不了ktv实体店,但是可以作为其非常好的补充,填补了在其碎片化的时间,以及关系维系的空白。

5.练歌房模式,其实很多人不经常k歌,而且缺乏自信心,他们使用k歌软件的初衷是听一下自己唱的如何。然后很沮丧,然后就没有然后了。如果可以在用户唱歌时给一些建议,哪怕是tips,比如如何换气,或唱歌时最后一个字不要抖,以及如何去把握节奏,用户一定会觉的这软件很贴心,后面再引导用户去发布,应该能增加歌曲来源。即使是做为一款帮助用户练习歌曲的纯本地app,也是有很大生存空间的。

再讲一次,k歌是一个硬需求,而其本身也是有能力支撑起一个社交系统的。用心的挖掘,音乐社交应该,也有能力成为一个伟大的项目。

—————— 我是华丽丽的分割线 ——————

试用了一下小米的米吧,k歌插件不错,但是入口太深,关系不紧,而且是两个东西。把k歌作为一种交互方式。这样虽然极大丰富了做为贴吧的可玩性,但是也牺牲了k歌本身的扩展性,一言以蔽之,把一个大的创意做小了。这样再做下去,k歌相关业务的发展会越来越受到大的框架的限制,现在他们应该是处于选择的关头了吧,估计内部应该也有类似的分歧。奋斗吧,骚年!

vpn销售 架构

首页

帐号 注册登陆 

冲值,在线支付

后台,查看支付信息,已卖出vpn信息

vpn流量控制

vpn带宽限制

充值后自动生成帐号并启用程式。

 

恩,目前就这些,呵呵