~ubuntu-dev/mplayer/ubuntu-feisty

« back to all changes in this revision

Viewing changes to libmpdemux/ai_oss.c

  • Committer: Reinhard Tartler
  • Date: 2006-07-08 08:45:33 UTC
  • Revision ID: siretart@tauware.de-20060708084533-dbc155bde7122e78
imported mplayer_0.99+1.0pre7try2+cvs20060117

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#include <stdlib.h>
 
3
 
 
4
#include "config.h"
 
5
 
 
6
#if defined(USE_TV) && (defined(HAVE_TV_V4L) || defined(HAVE_TV_V4L2)) && defined(USE_OSS_AUDIO)
 
7
 
 
8
#include <string.h> /* strerror */
 
9
#include <fcntl.h>
 
10
#include <errno.h>
 
11
#include <sys/ioctl.h>
 
12
 
 
13
#ifdef HAVE_SYS_SOUNDCARD_H
 
14
#include <sys/soundcard.h>
 
15
#else
 
16
#ifdef HAVE_SOUNDCARD_H
 
17
#include <soundcard.h>
 
18
#else
 
19
#include <linux/soundcard.h>
 
20
#endif
 
21
#endif
 
22
 
 
23
#include "audio_in.h"
 
24
#include "mp_msg.h"
 
25
#include "help_mp.h"
 
26
 
 
27
int ai_oss_set_samplerate(audio_in_t *ai)
 
28
{
 
29
    int tmp = ai->req_samplerate;
 
30
    if (ioctl(ai->oss.audio_fd, SNDCTL_DSP_SPEED, &tmp) == -1) return -1;
 
31
    ai->samplerate = tmp;
 
32
    return 0;
 
33
}
 
34
 
 
35
int ai_oss_set_channels(audio_in_t *ai)
 
36
{
 
37
    int err;
 
38
    int ioctl_param;
 
39
 
 
40
    if (ai->req_channels > 2)
 
41
    {
 
42
        ioctl_param = ai->req_channels;
 
43
        mp_msg(MSGT_TV, MSGL_V, "ioctl dsp channels: %d\n",
 
44
               err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_CHANNELS, &ioctl_param));
 
45
        if (err < 0) {
 
46
            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2SetChanCount,
 
47
                   ai->req_channels);
 
48
            return -1;
 
49
        }
 
50
        ai->channels = ioctl_param;
 
51
    }
 
52
    else
 
53
    {
 
54
        ioctl_param = (ai->req_channels == 2);
 
55
        mp_msg(MSGT_TV, MSGL_V, "ioctl dsp stereo: %d (req: %d)\n",
 
56
               err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_STEREO, &ioctl_param),
 
57
               ioctl_param);
 
58
        if (err < 0) {
 
59
            mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2SetStereo,
 
60
                   ai->req_channels == 2);
 
61
            return -1;
 
62
        }
 
63
        ai->channels = ioctl_param ? 2 : 1;
 
64
    }
 
65
    return 0;
 
66
}
 
67
 
 
68
int ai_oss_init(audio_in_t *ai)
 
69
{
 
70
    int err;
 
71
    int ioctl_param;
 
72
 
 
73
    ai->oss.audio_fd = open(ai->oss.device, O_RDONLY);
 
74
    if (ai->oss.audio_fd < 0)
 
75
    {
 
76
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2Open,
 
77
               ai->oss.device, strerror(errno));
 
78
        return -1;
 
79
    }
 
80
        
 
81
    ioctl_param = 0 ;
 
82
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp getfmt: %d\n",
 
83
           ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETFMTS, &ioctl_param));
 
84
        
 
85
    mp_msg(MSGT_TV, MSGL_V, "Supported formats: %x\n", ioctl_param);
 
86
    if (!(ioctl_param & AFMT_S16_LE))
 
87
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_UnsupportedFmt);
 
88
 
 
89
    ioctl_param = AFMT_S16_LE;
 
90
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp setfmt: %d\n",
 
91
           err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SETFMT, &ioctl_param));
 
92
    if (err < 0) {
 
93
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2SetAudioFmt);
 
94
        return -1;
 
95
    }
 
96
 
 
97
    if (ai_oss_set_channels(ai) < 0) return -1;
 
98
        
 
99
    ioctl_param = ai->req_samplerate;
 
100
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp speed: %d\n",
 
101
           err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SPEED, &ioctl_param));
 
102
    if (err < 0) {
 
103
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2SetSamplerate,
 
104
               ai->req_samplerate);
 
105
        return -1;
 
106
    }
 
107
    ai->samplerate = ioctl_param;
 
108
 
 
109
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp trigger: %d\n",
 
110
           ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETTRIGGER, &ioctl_param));
 
111
    mp_msg(MSGT_TV, MSGL_V, "trigger: %x\n", ioctl_param);
 
112
    ioctl_param = PCM_ENABLE_INPUT;
 
113
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp trigger: %d\n",
 
114
           err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
 
115
    if (err < 0) {
 
116
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2SetTrigger,
 
117
               PCM_ENABLE_INPUT);
 
118
    }
 
119
 
 
120
    ai->blocksize = 0;
 
121
    mp_msg(MSGT_TV, MSGL_V, "ioctl dsp getblocksize: %d\n",
 
122
           err = ioctl(ai->oss.audio_fd, SNDCTL_DSP_GETBLKSIZE, &ai->blocksize));
 
123
    if (err < 0) {
 
124
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_Unable2GetBlockSize);
 
125
    }
 
126
    mp_msg(MSGT_TV, MSGL_V, "blocksize: %d\n", ai->blocksize);
 
127
 
 
128
    // correct the blocksize to a reasonable value
 
129
    if (ai->blocksize <= 0) {
 
130
        ai->blocksize = 4096*ai->channels*2;
 
131
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_AudioBlockSizeZero, ai->blocksize);
 
132
    } else if (ai->blocksize < 4096*ai->channels*2) {
 
133
        ai->blocksize *= 4096*ai->channels*2/ai->blocksize;
 
134
        mp_msg(MSGT_TV, MSGL_ERR, MSGTR_MPDEMUX_AIOSS_AudioBlockSize2Low, ai->blocksize);
 
135
    }
 
136
 
 
137
    ai->samplesize = 16;
 
138
    ai->bytes_per_sample = 2;
 
139
 
 
140
    return 0;
 
141
}
 
142
 
 
143
#endif /* USE_OSS_AUDIO */