2016-06-15 4 views
1

목록 항목을 클릭 할 때 다른 사운드 효과를 재생하는 ListView로 활동을 만들고 싶습니다. MediaPlayer 및 SoundPool을 사용하여이 기능을 테스트했으며 두 가지 모두 정상적으로 작동합니다.Android : AudioTrack이 제대로 작동하지 않습니다.

AudioTrack을 구현했지만 ListView에서 항목을 클릭하면 노이즈가 재생되거나 "잘못된 오디오 버퍼 크기"라는 오류가 발생합니다.

여기 내 코드가 있습니다.

public class ATSoundAdapter extends ArrayAdapter { 

    private ArrayList<SoundData> mData; 
    private Context context; 
    private AudioTrack at; 


    public ATSoundAdapter(Context context, ArrayList<SoundData> mData) { 
     super(context, -1); 
     this.context = context; 
     this.mData = mData; 
    } 

    public class ViewHolder { 
     private TextView mSoundNameTv; 
     private LinearLayout container; 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     ViewHolder holder; 

     if (convertView == null) { 
      convertView = LayoutInflater.from(context) 
        .inflate(R.layout.list_item, 
          parent, false); 
      holder = new ViewHolder(); 
      holder.mSoundNameTv = (TextView) convertView.findViewById(R.id.sound_name_tv); 
      holder.container = (LinearLayout) convertView.findViewById(R.id.container); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final SoundData currentSound = mData.get(position); 
     if (currentSound != null) { 
      holder.mSoundNameTv.setText(currentSound.getSoundName()); 
      holder.container.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        playAudioTrack(currentSound.getSoundResource()); 
       } 
      }); 
     } 
     return convertView; 
    } 

    private void playAudioTrack(int resource) { 
     int i = 0; 
     InputStream inputStream = context.getResources().openRawResource(resource); 
     long bufferSize = context.getResources().openRawResourceFd(resource).getLength(); 
     byte[] buffer = new byte[(int)bufferSize]; 
     try { 
      int lengthOfAudioClip = inputStream.read(buffer, 0, buffer.length); 
      AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 
        44100, AudioFormat.CHANNEL_OUT_STEREO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        lengthOfAudioClip, AudioTrack.MODE_STATIC); 
      at.write(buffer, 0, lengthOfAudioClip); 
      inputStream.close(); 
      at.play(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 
} 

바이트 배열 크기가 잘못되었다고 생각했지만 ... logcat에서 확인했을 때 정확히 원시 파일 크기였습니다. 저는 안드로이드를 처음 접했고 AudioTrack 사용법을 모릅니다.

미리 감사드립니다.

+0

을 확인할 수 있습니다 무슨 잘못'MediaPlayer'와'SoundPool'와? – pskink

+0

http://estackoverflow.com/questions/9409811/audiorecorder-in-android-error-invalid-buffer-size - 이것을 확인하십시오. – Narendra

답변

0

당신은 당신의 코드

AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, lengthOfAudioClip, AudioTrack.MODE_STREAM);  

을 변경하거나 다른 사람이 그렇게이 link

관련 문제