技术备忘录之十一

2009-09-02

 

  • CONE 36 Panic的几种可能的原因
    --SDK文档的描述:
      Open handles were found during application shutdown
      引起CONE 36 panic的原因有以下几种:
      1)网上经常看到的“使用RHTTPTransaction后产生CONE 36 Panic”
      2)Load 了某个RLibrary,没有将其Close掉;
      3)Connect了某个Client,没有将其Close;
      4)RFs,RFileLogger connect,使用完未将其Close;
      5)RThread, RHeap, RArray等不需要Open(),但是需要Close()或者Reset()

 

  • 软件混音(原文出处http://blog.csdn.net/tangl_99/archive/2005/11/07/524647.aspx
    --Symbian 6.1上实现的混音是个比较麻烦的问题,因为程序只能同时播放一个音乐,实现混音就需要程序自己来实现。下面是我从newlc上找到的一个关于PCM脉冲编码的音频信号的混音实现,其中包含了一个关键的混音算法!

Hi !!!!

 I am not sure weather I have fully understood your question or not, I persume that you are  asking
"How can we mix two or more audio stream", If this is the question then I am explaning below the
mixing of the two audio stream (You Can Mix More Audio Stream),

Step 1,

Get the Raw data of the two files, (Example, of the sample 8bit and 8Kh, means one sample is of
8bit)


Step 2

Let the two audio signal be A and B respectively, the range is between 0 and 255.  Where A and B are the
Sample Values (Each raw data) And store the resultant into the Y

If Both the samples Values are possitve

Y = A  +  B - A * B / 255

Where Y is the resultant signal which contains both signal A and B, merging two audio streams into single
stream by this method solves the  problem of overflow and information loss to an extent.


   If the range of 8-bit sampling is between -127 to 128

   If both A and B are negative       Y = A +B - (A * B / (-127))
   Else                                       Y = A + B - A * B / 128


Similarly for the nbit (ex 16bit data)

   For  n-bit sampling audio signal


   If both A and B are negative       Y = A + B - (A * B  /  (-(2 pow(n-1) -1)))
   Else                                       Y = A + B - (A * B /  (2 pow(n-1))


Step 3.

Add the Header to the Resultant (mixed) data and play back.

If some thing is unclear and ambigious let me know.

Regards
Ranjeet Gupta.


还有简单C程序示意代码,但是其中包含了核心算法:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

int main(int argc,char *argv[]) {
  char mixname[255];
  FILE *pcm1, *pcm2, *mix;
  char sample1, sample2;
  int value;

  pcm1 = fopen(argv[1],"r");
  pcm2 = fopen(argv[2],"r");
  
  strcpy (mixname, argv[1]);
  strcat (mixname, "_temp.wav");
  mix = fopen(mixname, "w");

  while(!feof(pcm1)) {

    sample1 = fgetc(pcm1);
    sample2 = fgetc(pcm2);
    
    if ((sample1 < 0) && (sample2 < 0)) {
      value = sample1 + sample2 - 
                    (sample1 * sample2 / -(pow(2,16-1)-1));
    }else{
      value = sample1 + sample2 - 
                          (sample1 * sample2 / (pow(2,16-1)-1));
    }

    fputc(value, mix);
  }

  fclose(pcm1);
  fclose(pcm2);
  fclose(mix);

  return 0;
}

 

注: 附件为具体实现代码

     实现功能:

  1. 用CMdaAudioOutputStream实现以流形式播放WAV音频文件
  2. 音频混音功能:仅限于具有相同采样率,采样深度以及声道数的多路音频文件

你可能感兴趣的:(.net,算法,Blog,音乐,Symbian)