2016-07-30 10 views
1

私は現在、alsa API(libasound)を使って開発することを学んでいます。 私のUSBサウンドカードにPCMサウンドを送りたい。libasoundでUSBサウンドカードでサウンドを再生できません。 (C++)

私はこのコードを実行します。

#include <stdio.h> 
#include <stdlib.h> 
#include <alsa/asoundlib.h> 

#include "helloPi.h" 

int main(int argc, char *argv[]) { 
    int i; 
    int err; 

    snd_pcm_t *playback_handle; 
    snd_pcm_hw_params_t *hw_params; 

    if ((err = snd_pcm_open(&playback_handle, "hw:1,0", SND_PCM_STREAM_PLAYBACK, 
     0)) < 0) { 
     fprintf(stderr, "cannot open audio device %s (%s)\n", argv[1], 
      snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) { 
     fprintf(stderr, "cannot allocate hardware parameter structure (%s)\n", 
      snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params_any(playback_handle, hw_params)) < 0){ 
     fprintf(stderr, "cannot initialize hardware parameter structure (%s)\n", 
      snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params_set_access(playback_handle, hw_params, 
     SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { 
     fprintf(stderr, "cannot set access type (%s)\n", snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params_set_format(playback_handle, hw_params, 
     SND_PCM_FORMAT_S16_LE)) < 0) { 
     fprintf(stderr, "cannot set sample format (%s)\n", snd_strerror(err)); 
     exit(1); 
    } 

    unsigned int freq = 44100; 

    if ((err = snd_pcm_hw_params_set_rate_near(playback_handle, hw_params, 
     &freq, 0)) < 0) { 
     fprintf(stderr, "cannot set sample rate (%s)\n", snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params_set_channels(playback_handle, hw_params, 2)) 
     < 0) { 
     fprintf(stderr, "cannot set channel count (%s)\n", snd_strerror(err)); 
     exit(1); 
    } 

    if ((err = snd_pcm_hw_params(playback_handle, hw_params)) < 0) { 
     fprintf(stderr, "cannot set parameters (%s)\n", snd_strerror(err)); 
     exit(1); 
    } 

    snd_pcm_hw_params_free(hw_params); 

    if ((err = snd_pcm_prepare(playback_handle)) < 0) { 
     fprintf(stderr, "cannot prepare audio interface for use (%s)\n", 
      snd_strerror(err)); 
     exit(1); 
    } 

    for (i = 0; i < 100; ++i) { 
     if ((err = snd_pcm_writei(playback_handle, buf, 2048)) < 0) { 
      fprintf(stderr, "write to audio interface failed (%s)\n", 
       snd_strerror(err)); 
      exit(1); 
     } 
    } 

    snd_pcm_close(playback_handle); 
    exit(0); 
    } 

注意: BUF は音波を含むHelloPi.hで宣言された配列です。

私はsnd_pcm_open使用する場合(& playback_handle、 "HW:1,0"、SND_PCM_STREAM_PLAYBACKを、0)HWと:0,0、私のラップトップの内部サウンドカードが搭載された作業罰金です。しかし、hw:1,を使用してusbサウンドカードを使用すると、何も起こりません(エラーでさえも!)。

私はターミナルで実行する場合:

aplay -l 

私は次のような結果があります。

carte 0: PCH [HDA Intel PCH], périphérique 0: ALC283 Analog [ALC283 Analog] 
    Sous-périphériques: 1/1 
    Sous-périphérique #0: subdevice #0 
carte 0: PCH [HDA Intel PCH], périphérique 3: HDMI 0 [HDMI 0] 
    Sous-périphériques: 1/1 
    Sous-périphérique #0: subdevice #0 
carte 1: Set [C-Media USB Headphone Set], périphérique 0: USB Audio [USB Audio] 
    Sous-périphériques: 1/1 
    Sous-périphérique #0: subdevice #0 

こんにちは

を私がして音しているので、USBカードがOKであることを知っています:

speaker-test -Dhw:1,0 -c2 -twav 

私のコードがhw:1,0 ...

の音を出すノートである理由は分かりませんでした。 ありがとう、

Maxime。

+1

"Nothing"?何が起こりますか?それはどのくらいかかりますか? –

+0

サウンドカードからサウンドが消えません。 snd_pcm_hw_params()は即座に実行されます。内蔵のサウンドカードではそうではありません。 – Max

答えて

0

解決策を見つけるには、サンプルで提供されているコードをasoundライブラリで使用します。

/* 
* This extra small demo sends a random samples to your speakers. 
*/ 

#include <alsa/asoundlib.h> 
static char *device = "hw:1,0";   /* playback device */ 

snd_output_t *output = NULL; 
unsigned char buffer[16*1024];    /* some random data */ 

int main(void) 
{ 
     int err; 
     unsigned int i; 
     snd_pcm_t *handle; 
     snd_pcm_sframes_t frames; 

     for (i = 0; i < sizeof(buffer); i++) 
       buffer[i] = random() & 0xff; 

    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { 
     printf("Playback1 open error: %s\n", snd_strerror(err)); 
     exit(EXIT_FAILURE); 
    } 
    if ((err = snd_pcm_set_params(handle, 
            SND_PCM_FORMAT_S16, 
            SND_PCM_ACCESS_RW_INTERLEAVED, 
            2, 
            44100, 
            0, 
            50000)) < 0) { /* 0.5sec */ 
     printf("Playback2 open error: %s\n", snd_strerror(err)); 
     exit(EXIT_FAILURE); 
    } 

     for (i = 0; i < 16; i++) { 
       frames = snd_pcm_writei(handle, buffer, sizeof(buffer)); 
       if (frames < 0) 
         frames = snd_pcm_recover(handle, frames, 0); 
       if (frames < 0) { 
         printf("snd_pcm_writei failed: %s\n", snd_strerror(frames)); 
         break; 
       } 
       if (frames > 0 && frames < (long)sizeof(buffer)) 
         printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames); 
     } 

    snd_pcm_close(handle); 
    return 0; 
} 

私はまだ最初のコードがうまくいかなかった理由を調べる必要があります。

Bye、 Maxime。

関連する問題